13

単純な Option で for ループを使用すると、次のように機能します。

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

ただし、 Option の内容をループしても、次のことは行われません。

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)

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

4

1 に答える 1

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

に翻訳されます

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

上のflatMapメソッドOptionは、を返す関数を期待していますが、Optionを返す関数を渡しており、からへListの暗黙の変換はありません。ListOption

Optionここで、最初にをリストに変換すると、代わりにのflatMapメソッドが呼び出されます。このメソッドは、渡されるものであるをList返す関数を期待します。List

この特定のケースでは、最も慣用的な解決策は

Some(List(1,2,3)).flatten.toList
于 2012-12-20T06:29:18.750 に答える