假设我有这个单子类:
case class Foo[A](xs: List[A]) {
def map[B](f: A => B) = Foo(xs map f)
def flatMap[B](f: A => Foo[B]) = Foo(xs flatMap f.andThen(_.xs))
def withFilter(p: A => Boolean) = {
println("Filtering!")
Foo(xs filter p)
}
}
以下来自 2.10.0 REPL 会话:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
res0: Foo[Int] = Foo(List(1))
这是 2.10.1 中的相同内容:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
Filtering!
res0: Foo[Int] = Foo(List(1))
这完全出乎我的意料(对我而言),并且在过滤需要额外约束(例如 Scalaz\/
或EitherT
)的情况下会导致特别令人困惑的错误。
我无法在2.10.1 发行说明中找到有关此更改的任何讨论。有人能指出这种新的脱糖行为是在哪里以及为什么引入的吗?