関数型プログラミングのデータ構造 ……続き
foldLeft, foldRight, foldについて
この先読み進めていくと延々とfoldRight
と、foldRight
と、fold
が出てきます。’畳み込む’という操作を抜き出し、一つのパターンとして定義しているのは関数型のパラダイムで見られるやり方です。ただ、コードだけを見て頭の中で挙動を想像しながら追いかけるだけでは理解しづらいので、下記のブログエントリを参考にすると理解が捗るでしょう。
map, flatMapについて
map
メソッドは分かりやすいですよね、すべての要素に対して指定された関数を適用して変換していく……適用する前も後もデータ構造や要素の数は変わらない……要素数が10個のリストにmap
メソッドを適用すると要素の数はやはり10個だし、リストであることにも変わりません。
一方でflatMap
はちょっと分かりづらいです。flatten
+ map
だからflatMap
だよ、という解説を最初に見ましたがリスト以外のいろいろなデータ構造にflatMap
は出てきます。Option
や、Future
にもflatMap
はあります。そうすると「入れ子になったリストを展開して関数を適用するだけじゃないな?」と気づいてきます。
例えばListのflatMapのシグニチャはdef flatMap[A, B](as: List[A], f: A => List[B]): List[B]
となっていて、あくまでList[B]
を返す関数を引数に取っています。map
のようにf: A => B
ではありません。
と疑問に思ったところで、以下のブログエントリを読むと理解が捗るでしょう。
おわりに
次回は、4章へ進みます