2011-11-29 11 views
10

Farklı davranışlar alıyorum, 2.9.1 ve 2.10 her gece - ne değişti?Bir Seçeneği Sabitleme Farkı [Liste [Int]] 2.9.1 ve 2.10 her gece

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) 

Karşı:

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 

cevap

16

nedeni Seçenek yalnızca iç içe Option s çalışır 2.10'da bir flatten yöntemi, kazanılmış olduğunu.

2.9'da, düzleştirme çağrısı, Iterable'a dolaylı bir dönüştürme ile eklenmiş ve sonuç, Iterable (veya Option'un iç içe geçmiş değerine bağlı olarak bunun bir alt türü) olmuştur.

Burada 2.10'da flatten imzası var:

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

Diyor: Bu seçenek içinden eleman bir Option kendisi olduğunu kanıtlar bulabilirse, bunu dümdüz ve bir Option[B] döndürebilir, Option[B] söylerler.

Yalnızca bu adı taşıyan no yönteminin uygulandığı durumlarda, örtükler yalnızca denenir, bu nedenle neden 2.9 yöntemine geri dönülmediğini açıklar.

+0

Bu yeni 'flatten' Haskell'in monadic 'join' ile daha uyumlu olduğu ortaya çıkıyor; niyet bu mu? –

+0

Umarım herkes 2.10'a yükseldiklerinde kapsamlı regresyon testi yapar! –

+0

Option [Option [X]] seçeneğinin, Option [X] 'e göre düzleştirilebileceği kesin bir gelişme olsa da, yinelenen vaka hakkında biraz utanç verici olsa da. Ben daha esnek bir flatten bir çift tip makine ile birlikte koymak olabilir varsayalım, gerçekten bu kötü bir şekilde istediyseniz ... –