2012-12-20 4 views
13

は動作します:Optionはforループ内で明示的にtoListを必要とするのはなぜですか?簡単なオプションでループのために使用

scala> for (lst <- Some(List(1,2,3))) yield lst 
res68: Option[List[Int]] = Some(List(1, 2, 3)) 

しかし、オプションの内容をループしません:

scala> for (lst <- Some(List(1,2,3)); x <- lst) yield x 
<console>:8: error: type mismatch; 
found : List[Int] 
required: Option[?] 
       for (lst <- Some(List(1,2,3)); x <- lst) yield x 
              ^

...オプションが明示的にリストに変換されていない場合:

scala> for (lst <- Some(List(1,2,3)).toList; x <- lst) yield x 
res66: List[Int] = List(1, 2, 3) 

なぜ明示的なリストの変換が必要とされていますか?これは慣用的な解決策ですか?

答えて

12
for (lst <- Some(List(1,2,3)); x <- lst) yield x 

OptionflatMap方法はOption返す関数を期待

Some(List(1,2,3)).flatMap(lst => lst.map(x => x)) 

に翻訳されていますが、Listを返す関数を渡しているとListからの暗黙的な変換にはありませんOption。あなたが最初のリストにOptionを変換する場合

は今、ListflatMap方法は、あなたがそれに渡しているものですListを返す関数を、期待しており、代わりに呼び出されます。この特定のケースで

、私はほとんどの慣用的なソリューションがなぜ `用(LST <ある

Some(List(1,2,3)).flatten.toList 
+0

だと思います - いくつかの(一覧(1,2,3))を取得; X < - オプション(LST ))yield x'も働く。面白い。 – sberry

関連する問題