kinoppyd.dev

blog

products

accounts & contact

Option型のmapとflatMapがようやくわかった(Scalaの話)

posted at 2014-07-30 13:41:04 +0900 by kinoppyd

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を連続で使うときのためのもの、と認識することにした。関数型脳の道は遠い。