Методы против функции и последствия в Scala - PullRequest
8 голосов
/ 18 марта 2012

Давайте объявим def и эквивалентную функцию как val:

scala> def optional(x:Int):Option[String] = None
optional: (x: Int)Option[String]

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

Теперь, почему это не работает?

scala> List(1).flatMap(optional2)
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => scala.collection.GenTraversableOnce[?]
              List(1).flatMap(optional2)
                              ^

В то время как оба они делают?

scala> List(1).flatMap(optional)
res4: List[String] = List()

scala> List(1).flatMap(optional2(_))
res5: List[String] = List()

Поскольку Option не является подтипом GenTraversableOnce, я думаю, что это как-то связано с последствиями, но я не могу понять, что именно. Я использую Scala 2.9.1.

1 Ответ

7 голосов
/ 18 марта 2012

Неявное преобразование Option.option2Iterable - это то, что заставляет List(1).flatMap(optional) и List(1).flatMap(optional2(_)) работать.

Ваш вопрос можно свести к тому, что неявное преобразование не будет обнаружено:

scala> val optional2:(Int)=>Option[String] = (i:Int) => None
optional2: Int => Option[String] = <function1>

scala> (optional2(_)): Function[Int, Iterable[String]]
res0: Int => Iterable[String] = <function1>

scala> (optional2): Function[Int, Iterable[String]]
<console>:9: error: type mismatch;
 found   : Int => Option[String]
 required: Int => Iterable[String]

Когда вы используете подчеркивание, компилятор пытается ввести функцию и обеспечить необходимое неявное преобразование.Когда вы просто предоставляете option2, не применяется неявное преобразование.

...