2013-07-02 5 views
24

मान लीजिए मैं इस monadic वर्ग है:न्यू 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 आरईपीएल सत्र से है .1:

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

यह पूरी तरह से अप्रत्याशित (मेरे लिए) है, और जहां छानने requ मामलों में विशेष रूप से भ्रामक त्रुटियों की ओर जाता है ires अतिरिक्त बाधाओं (जैसे स्कालज़ के \/ or EitherT)।

मुझे 2.10.1 release notes में इस परिवर्तन की कोई चर्चा नहीं मिली। क्या कोई यह बता सकता है कि यह नया desugaring व्यवहार कहाँ और क्यों पेश किया गया था?

उत्तर

16

कहानी उससे अधिक जटिल है, और वास्तव में यह 2.10.0 प्रतिगमन है जो वहां प्लग किया गया था।

"नहीं- withFilter" व्यवहार c82ecab में पेश किया गया था, और क्योंकि SI-6968 तरह बातें की, इस आंशिक रूप से #1893 को वापस लाया गया था।

पार्सर कल्पना नहीं कर सकते कि एक पैटर्न (ए, बी) का मिलान होगा, परिणाम के रूप में की : इसके अलावा रूपांतरों (SI-6646, SI-7183)

टेकअवे वाक्य आप देख रहे हैं है का पालन किया। isInstanceOf [Tuple2] को टाइपर के बाद तक स्थैतिक रूप से ज्ञात नहीं किया जा सकता है।

संबंधित मुद्दे