2013-07-02 7 views
24

は、私はこのモナドのクラスがあるとします。新スカラ座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) 
    } 
} 

次は2.10.0 REPLセッションから次のとおりです。

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

そして、ここでは2.10で同じことです0.1:これは(私には)全く予想外で、どこフィルタリングのrequ場合に特に混乱エラーをリードし

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回帰です。

"withFilter"の動作はc82ecabに導入されました。SI-6968などの理由により、これは部分的に#1893に戻されました。さらに、適応は、あなたが探している持ち帰り文がある

に(SI-6646SI-7183)の続き:

パーサを(a、b)は結果の として、マッチするパターンと仮定することはできません。 isInstanceOf [Tuple2]は、 タイピングの後まで静的に知ることができません。