「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)

たとえばmap。これって、よくコレクションにつかうメソッドですの。
 でも、そういうメソッドが、実はOption型にも付いてるんですの。(たくさん!)

 Option型を使う場合、基本的にはmatchを使って中身を調べるのですけど、それをさぼる方法もいっぱい用意されてますの。きっと、コレクション操作メソッドもその一つですの。
 これを使うと、Option型の処理をコレクション操作の中に自然に織り込めるという点で、とっても素敵なのですの。

 よく見かけるのは、foreachを使う方法ですの。でも、mapなら値が返ってくるので、より関数型ちっくな書き方ができますの。この辺の選択基準は、コレクションを扱うときと同じですの。

 mapやforeachの他にも、filterやcollectなんかもあって、果てはイテレータまで取れるので、もうコレクションの一種だと思ってしまってもいいくらいですの。

 ただ、実際のところ、コレクションとは継承関係の繋がりは一切無くて、あくまで同名の専用メソッドを用意しているだけのようなので、全く同じように使えるわけでは無いのですの。ちょっと注意ですの。

 それがハッキリわかるのが、mapとflatMapの動作で、次回はそれについてですの。