Upgrade to Pro — share decks privately, control downloads, hide ads and more …

関数型プログラミング実践入門を読んで

Avatar for masato masato
November 26, 2022

 関数型プログラミング実践入門を読んで

Avatar for masato

masato

November 26, 2022

More Decks by masato

Other Decks in Programming

Transcript

  1. 例:1からNまでの総和を求める関数 C言語の例: int totalFrom1To(int n) { int result = 0;

    for (int i = 1; i <= n; result += i++); return result; } Haskell: totalFrom1To n = sum . enumFromTo 1 n haskellでは1からnまでのリストを生成してsum。 見通しはいいが、一度リストを作る分無駄がある?
  2. haskellの最適化:最適化された計算過程(n = 5) sum (enumFromTo 1 5) => 1 +

    sum (enumFromTo 2 5) => 1 + 2 + sum (enumFromTo 3 5) => 1 + 2 + 3 + sum (enumFromTo 4 5) => 1 + 2 + 3 + 4 + sum (enumFromTo 5 5) => 1 + 2 + 3 + 4 + 5 + sum (enumFromTo 6 5) => 1 + 2 + 3 + 4 + 5 + 0 最適化すればリストを作らずに計算が進む
  3. 並行化、並列化しやすい 純粋関数の組み合わせならば実行順にかかわらず安全性が保証される var t = f(); var s = g();

    console.log(t + s); f, gは並列化できそうだが、もしgがfの中身に依存していたら、安易に並 列化できない f, gが純粋関数ならその心配がない ※ プログラマが注意すれば純粋関数で構成することもできるが、注意力 に頼らずともhaskellなら言語機能で純粋性を保証してくれる
  4. 高階関数と関数合成の使用 haskellでの関数合成 totalFrom1To n = sum . enumFromTo 1 n

    scala: 高階関数: flattern, map, flatMap, fold 関数合成:compose, andThen
  5. パターンマッチを使う ifよりcase文を使う。 sealed trait + case文を使いパターンマッチ漏れを防ぐ sealed trait Answer case

    object Yes extends Answer case object No extends Answer scala> val x: Answer = Yes x: Answer = Yes scala> x match { | case No => println("No") | } <console>:12: warning: match is not exhaustive!