Scala中的方法与函数和含义
发布时间:2020-12-16 08:52:30 所属栏目:安全 来源:网络整理
导读:让我们将def和等效函数声明为val: scala def optional(x:Int):Option[String] = Noneoptional: (x: Int)Option[String]scala val optional2:(Int)=Option[String] = (i:Int) = Noneoptional2: Int = Option[String] = function1 现在为什么这不起作用? sca
让我们将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. 解决方法
隐式转换
Option.option2Iterable是使List(1).flatMap(可选)和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时,没有适用的隐式转换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |