Я видел поведение List, упомянутое докладчиком в видео лекции Scala. Потом подумал, что попробую с картой. Кроме того, видя такое же разрешение типов через / через другой тип.

Мне интересно, как работает это разрешение? Было ли это намерено со стороны команды разработчиков языка / компилятора Scala? Заинтересовала появившаяся причуда? Будет ли это работать в Dotty так же, но с другим синтаксисом? Есть ли что-то особенное в том, как определены List и Map, в котором говорится, что в основном я могу работать как функция и обменивать один тип на другой?

Вот пример кода, иллюстрирующий то, о чем я говорю:

  // I'm being verbose to stress the types
  implicit val theList: List[String] = List("zero", "one", "two", "three")
  implicit val theMap: Map[Double, String] = Map(1.1 -> "first", 2.1 -> "second")

  def doExample(v: String): Unit = {
    println(v)
  }

  doExample(1)
  // prints "one"
  doExample(1.1)
  // prints "first"
2
BuddyJoe 18 Июн 2020 в 21:41

1 ответ

Лучший ответ

Я думаю, потому что

implicitly[List[String] <:< (Int => String)]             // ok
implicitly[Map[Double, String] <:< (Double => String)]   // ok

Так что следующее действительно

val x: Int => String = List("zero", "one", "two", "three")
val y: Double => String = Map(1.1 -> "first", 2.1 -> "second")

x(1)
y(1.1)
// val res5: String = one
// val res6: String = first 
3
Mario Galic 18 Июн 2020 в 18:57