2013-07-02 4 views
24

나는이 모나드 클래스가 있다고 가정새로운 desugaring 동작 2.10.1

scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a 
res0: Foo[Int] = Foo(List(1)) 

그리고 여기에 2.10에서 같은 일이 :

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 세션에서입니다 .1 :

scala> for { (a, b) <- Foo(List(1 -> "x")) } yield a 
Filtering! 
res0: Foo[Int] = Foo(List(1)) 

이것은 완전히 예상하지 못했던 것이며 (필자에게) 특히 필터링 요청이 추가 제약 조건 (예 : Scalaz의 \/ or EitherT)이 있습니다.

2.10.1 release notes에서이 변경 사항에 대한 설명을 찾을 수 없습니다. 누군가가이 새로운 desugaring 행동이 도입 된 이유와 이유를 지적 할 수 있습니까?

답변

16

이야기는 그보다 복잡하며 실제로 거기에 연결된 2.10.0 회귀입니다.

"no-withFilter"동작은 c82ecab에 도입되었으며 SI-6968 같은 이유로 부분적으로는 #1893으로 되돌려졌습니다.

파서는 패턴 (A, B)과 일치한다고 가정 할 수는 없습니다,의 결과로 : 더 적응 (SI-6646, SI-7183)

당신이 찾고있는 테이크 아웃 문장이 따랐다. isInstanceOf [Tuple2]는 타이프 이후까지 정적으로 알 수 없습니다.

관련 문제