「Option型=コレクション」と考えてみると、
 謎なのがmapとflatMapですの。

 結論から言うと、flatMapの挙動が斜め上なんですの。

 コード
 val list = List(List(1,2), List(1,2))
 val opt = Option(list)
 println(opt.flatMap(n => Option(n)))
 println(opt.map(n => n))

 結果
 Some(List(List(1, 2), List(1, 2)))
 Some(List(List(1, 2), List(1, 2)))

 なんとなく、flatMapなら「Some(List(1, 2, 1, 2))」となりそうなものですけど、mapの結果と一緒なのですの。

 Option型のmapとflatMapの違いはたぶん、関数の定義が微妙に違うだけなんですの。

 map   [B] (f: (A) ⇒ B    ): Option[B]
 flatMap [B] (f: (A) ⇒ Option[B]): Option[B]

 Scala API(*)の説明もこんな口ぶりですの。

 原文:Slightly different from map in that f is expected to return an Option (which could be None).
 意訳:fがOption(Noneの可能性も有り)を返すことになっているという点でmapとわずかに異なる

 その微妙な引数の差を、あえてmapとflatMapという名前で区別する意味がわかりませんの。ぷんすかぷん


*)Optionのページ (2.9.1 final)

0 コメント: