2011-11-29 4 views
10

夜間に2.9.1と2.10の動作が異なる - 何が変更されましたか?対夜間に2.9.1と2.10のオプション[List [Int]]の相違

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

その理由は、オプションのみのネストされたOptionの上で動作し2.10でflatten方法を、取得しています。

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

この新しい 'flatten'は、Haskellのモナドの' join'に沿ったものです。その意図ですか? –

+0

2.10にアップグレードすると誰もが徹底的な回帰テストをしてくれることを祈っています! –

+0

オプション[Option [X]]をOption [X]にフラット化できますが、Iterableの場合はちょっと残念です。私はあなたが本当にそれがひどくそれを望んでいた場合、より柔軟なflattenは、いくつかのtypeclass機械と一緒に置くことができると思います... –

関連する問題