2011-11-29 8 views
10

में फ़्लैटन करने में अंतर मुझे 2.9.1 और 2.10 रात में अलग व्यवहार मिलता है - क्या बदल गया?एक विकल्प [सूची [Int]] में 2.9.1 और 2.10 रात में

Welcome to Scala version 2.9.1.final (OpenJDK Client VM, Java 1.6.0_22). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> Some(3) map (x => List(x, -x)) flatten 
res0: List[Int] = List(3, -3) 

बनाम:

Welcome to Scala version 2.10.0.r26084-b20111129020255 (OpenJDK Client VM, Java 1.6.0_22). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> Some(3) map (x => List(x, -x)) flatten 
<console>:8: error: Cannot prove that List[Int] <:< Option[B]. 
       Some(3) map (x => List(x, -x)) flatten 

उत्तर

16

कारण यह है कि विकल्प का अधिग्रहण 2.10 में एक flatten विधि, कि केवल नेस्टेड Option रों पर काम करती है।

2.9 में, फ़्लैटन करने के लिए कॉल Iterable पर एक अंतर्निहित रूपांतरण द्वारा जोड़ा गया था, और परिणाम Iterable (या Option के अंदर नेस्टेड मान के आधार पर इसका उप प्रकार था)।

यहाँ 2.10 में flatten के हस्ताक्षर है:

def flatten[B](implicit ev: <:<[A, Option[B]): Option[B] 

इसे कहते हैं: अगर आपको लगता है कि इस विकल्प के अंदर तत्व एक Option ही है सबूत मिल सकते हैं, Option[B] कहते हैं, मुझे लगता है कि समतल और एक Option[B] लौट सकते हैं।

इम्प्लीसिट्स केवल तभी प्रयास किए जाते हैं जब कोई उस नाम के साथ विधि न हो, ताकि यह समझा जाए कि यह 2.9 विधि पर क्यों नहीं आती है।

+0

ऐसा प्रतीत होता है कि यह नया 'फ़्लैटन' हास्केल के मोनैडिक 'जॉइन' के अनुरूप है; क्या वह इरादा है? –

+0

आइए उम्मीद करते हैं कि जब वे 2.10 पर अपग्रेड करते हैं तो हर कोई पूरी तरह से रिग्रेशन परीक्षण करता है! –

+0

निश्चित रूप से एक विकल्प [विकल्प [एक्स]] विकल्प [एक्स] में फट सकता है, हालांकि यह इटेबल केस के बारे में शर्म की बात है। मुझे लगता है कि एक और अधिक लचीला flatten थोड़ा टाइपक्लास मशीनरी के साथ एक साथ रखा जा सकता है, अगर आप वास्तव में यह बुरी तरह से चाहते थे ... –

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