Scala中的方法与函数及其含义
让我们将def和等效函数声明为val: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
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]