让我们将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的子类型,我认为这必须与implicits有关,但我无法弄清楚究竟是什么。我使用的是Scala 2.9.1。
答案 0 :(得分:7)
隐式转化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]
使用下划线时,编译器会尝试键入函数并提供必要的隐式转换。当您只提供optional2时,没有适用的隐式转换。