Magnolia Tech

いつもコードのことばかり考えている人のために。

『Scala関数型デザイン&プログラミング』の演習問題をScala3で解く その4

blog.magnolia.tech

関数型プログラミングのデータ構造 ……続き

foldLeft, foldRight, foldについて

この先読み進めていくと延々とfoldRightと、foldRightと、foldが出てきます。’畳み込む’という操作を抜き出し、一つのパターンとして定義しているのは関数型のパラダイムで見られるやり方です。ただ、コードだけを見て頭の中で挙動を想像しながら追いかけるだけでは理解しづらいので、下記のブログエントリを参考にすると理解が捗るでしょう。

dev.classmethod.jp

dev.classmethod.jp

www.m3tech.blog

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ではありません。

と疑問に思ったところで、以下のブログエントリを読むと理解が捗るでしょう。

dev.classmethod.jp

おわりに

次回は、4章へ進みます