Scala中的方法与函数及其含义

Scala中的方法与函数及其含义,scala,option,implicits,Scala,Option,Implicits,让我们将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> 由于Option不是GenTrav

让我们将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>
由于Option不是GenTraversableOnce的子类型,我认为这一定与隐式有关,但我不知道它到底是什么。我使用的是Scala 2.9.1。

隐式转换使得
List(1).flatMap(可选)
List(1).flatMap(可选)工作起来

您的问题可以归结为隐式转换未得到解决:

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]
scala>val optional2:(Int)=>Option[String]=(i:Int)=>None
选项2:Int=>Option[String]=
scala>(可选2()):函数[Int,Iterable[String]]
res0:Int=>Iterable[String]=
scala>(可选2):函数[Int,Iterable[String]]
:9:错误:类型不匹配;
找到:Int=>Option[String]
必需:Int=>Iterable[String]

使用下划线时,编译器会尝试键入函数并提供必要的隐式转换。当您只提供optional2时,没有适用的隐式转换。

是的,但为什么不能在第一种情况下应用它?@KimStebel,
optional2
没有隐式转换。在第二种情况下,
optional2()
,编译器为您构建一个函数,并尝试匹配返回类型,此时它选择
option2Iterable
。换句话说,在存在隐式
R1=>R2
的情况下,
函数[T,R1]=>function[T,R2]
没有隐式转换。您需要使用
optional2(41;
构建一个新的函数对象,这样就可以进行隐式转换,在这种情况下,
i=>optional2(i:Iterable[String])
optional2
是一个对象,
optional2(41;
是一个新对象。
scala> List(1).flatMap(optional)
res4: List[String] = List()

scala> List(1).flatMap(optional2(_))
res5: List[String] = List()
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]