我每晚在2.9.1和2.10中得到不同的行为 - 改变了什么?
Welcome to Scala version 2.9.1.final (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> Some(3) map (x => List(x, -x)) flatten
res0: List[Int] = List(3, -3)
Run Code Online (Sandbox Code Playgroud)
与:
Welcome to Scala version 2.10.0.r26084-b20111129020255 (OpenJDK Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> Some(3) map (x => List(x, -x)) flatten
<console>:8: error: Cannot prove that List[Int] <:< Option[B].
Some(3) map (x => List(x, -x)) flatten
Run Code Online (Sandbox Code Playgroud)
Iul*_*gos 16
原因是Option flatten在2.10中获得了一个方法,该方法仅适用于嵌套Options.
在2.9中,通过隐式转换添加对flatten的调用Iterable,结果是Iterable(或其子类型,取决于内部的嵌套值Option).
这是flatten2.10中的签名:
def flatten[B](implicit ev: <:<[A, Option[B]): Option[B]
Run Code Online (Sandbox Code Playgroud)
它说:如果你能找到证据表明这个选项中的元素Option本身就是一个证据,那么Option[B]我可以将它弄平并返回Option[B].
仅当没有具有该名称的方法时才尝试使用Implicits ,因此这解释了为什么它不会回退到2.9方法.