Giả sử tôi có lớp monadic này:mới hành vi desugaring trong Scala 2.10.1
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)
}
}
Sau đây là từ một phiên 2.10.0 REPL:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
res0: Foo[Int] = Foo(List(1))
Và đây là điều tương tự trong 2.10 .1:
scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a
Filtering!
res0: Foo[Int] = Foo(List(1))
Điều này hoàn toàn bất ngờ (với tôi) và dẫn đến các lỗi đặc biệt khó hiểu trong trường hợp cần lọc ires ràng buộc bổ sung (chẳng hạn như của Scalaz \/
or EitherT
).
Tôi không thể tìm thấy bất kỳ cuộc thảo luận nào về thay đổi này trong 2.10.1 release notes. Ai đó có thể chỉ ra vị trí và lý do tại sao hành vi tuyệt vọng mới này đã được giới thiệu?