Scalaを始めて1ヶ月と少し。Option型のmapとflatMapを使う場面が現れ、一体こいつが何なのかを理解するのに時間がかかった。
mapは、A => B の関数を引数に取る。Option[A]の中身を取り出して、Some(A)の場合はA => B を適用し、Option化して返す。
内側でやっていることは
@inline filan def map(f: A => B): Option[B] =
if(isEmpty) None else Some(f(this.get))
で、一番頭を悩ませたのがflatMapで、一体こいつは何のために居るのかで悩んだ。
flatMapの定義はこんなかんじ
@inline final def flatMap[B](f: A => Option[B]): Option[B] =
if(isEmpty) None else f(this.get)
悩んだ結果、わかったのは、flatMapはmapを更に多重に呼び出すために居るらしいということ。
参考にしたページに似た例を使うと
def login(name :Option[String], password[Option]): Boolean =
name.flatMap(u => pwssword.map( p => database.isValid(u, p) ) ).getOrElse(false)
は、呼び出しを見ると、もしpがNoneだった場合に、password.mapの結果はNoneになる。だが、mapは A=>Bであって、A=>Noneを認めていない。
だが、flatMapはA=>Option[B]を引数に取り、かつNoneはOptionのサブクラスなので、A=>Noneとなってもコンパイルエラーを起こさない。
つまり、flatMapはmapを連続で使うときのためのもの、と認識することにした。関数型脳の道は遠い。