2013-07-02 28 views
24

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?

Trả lời

16

Câu chuyện phức tạp hơn thế và thực tế là hồi quy 2.10.0 đã được cắm vào đó.

Hành vi "no- withFilter" được giới thiệu trong c82ecab và do những thứ như SI-6968, hành động này đã được hoàn nguyên một phần #1893. thích nghi hơn nữa sau (SI-6646, SI-7183)

Câu takeaway bạn đang tìm kiếm là:

Các phân tích cú pháp không thể giả định rằng một mô hình (a, b) sẽ phù hợp, như kết quả của . isInstanceOf [Tuple2] không thể được biết đến tĩnh cho đến sau typer.