【问题标题】:Difference in flattening an Option[List[Int]] in 2.9.1 and 2.10 nightly每晚在 2.9.1 和 2.10 中展平 Option[List[Int]] 的区别
【发布时间】:2011-11-30 01:05:50
【问题描述】:

我在 2.9.1 和 2.10 nightly 中得到不同的行为 - 发生了什么变化?

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)

对比:

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    原因是 Option 在 2.10 中获得了 flatten 方法,该方法仅适用于嵌套的 Options。

    在 2.9 中,通过对 Iterable 的隐式转换添加了对 flatten 的调用,结果是 Iterable(或其子类型,取决于 Option 中的嵌套值)。

    这是 2.10 中flatten 的签名:

    def flatten[B](implicit ev: <:<[A, Option[B]): Option[B]
    

    它说:如果你能找到证据证明这个选项中的元素本身就是一个Option,比如Option[B],我可以把它展平并返回一个Option[B]

    只有当 no 方法具有该名称时才会尝试隐式,这解释了为什么它不回退到 2.9 方法。

    【讨论】:

    • 看来这个新的flatten 更符合Haskell 的单子join;是这个意图吗?
    • 希望大家在升级到 2.10 的时候做彻底的回归测试!
    • 绝对是 Option[Option[X]] 可以展平为 Option[X] 的改进,尽管 Iterable 的情况有点遗憾。我想一个更灵活的 flatten 可以与一些 typeclass 机器组合在一起,如果你真的非常想要它......
    • @DanBurton 是的,我也是这么认为的。
    • @MattR,可能,但是当前的flatten 也应该通过隐式添加。不知道这里什么是最好的,但我可以肯定地说我发现我的代码中的当前行为更有用。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2014-01-10
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多