nakaoka3の技術ブログ

2023年中に52本なにか書きます

『なっとく!関数型プログラミング』はScalaで説明されている本だけど読んだらHaskellのdoもわかるようになった

関数型プログラミング言語については、以前にHaskellの本を読んでみたりして、興味はあったのだが正直あまり理解できてなかった。

『なっとく!関数型プログラミング』はScalaのコードで関数型プログラミングを説明している本だ。最近邦訳が発売されて話題になっていたので買って読んでみた。

www.seshop.com

この本で入れ子のflatMap の説明から、Scalaの for 内包表記 を説明しているところを読んで、Haskell の do もこれかということに気がついた。

リストの場合

// 入れ子のflatMap
val result = 
    List(1, 2).flatMap { x =>
        List(10, 20).flatMap { y =>
            List(100, 200).map { z =>
                x + y + z
            }
    }
}
// for内包表記
val result2 = for {
    x <- List(1, 2)
    y <- List(10, 20)
    z <- List(100, 200)
} yield x + y + z

// List(111, 211, 121, 221, 112, 212, 122, 222)
println(result)
println(result2)

このようにflatMapのネストが深くなる処理から、for 内包表記だとネストがなくなるというような説明がされていた。

同じような処理は Haskell の do でも行える。見た目もそっくりだ。これのことだったのかとようやくわかった。

result :: [Int]
result = do
  x <- [1,2]
  y <- [10,20]
  z <- [100,200]
  return (x + y + z)

main :: IO ()
-- [111,211,121,221,112,212,122,222]
main = print result

この本ではJavaなどで馴染みのあるListから説明して、その後に Option、Either、IOの説明という流れになっている。

これらの型について馴染みのない数学的な用語で説明されているのではなく、見覚えのある問題の解決方法として1つずつ説明されており、Javaなどの関数型でない他のプログラミング言語ユーザーが関数型プログラミングを学ぶのに良い本になっていそうだった。

この本がきっかけで、最近は ScalaHaskell などの関数型プログラミングに興味が出てきて、色々と調べたり触ったりしている。結構楽しい。