'fibonacci n = case n of 0 -> 0; 1 -> 1; -> fibonacci (n-1) + fibonacci (n-2)' こんな風に、数学的な定義そっくりに書けるのが魅力。ガード節との組み合わせもよく使う手法で、'describeNumber n n < 0 = "Negative" n == 0 = "Zero" otherwise = "Positive"' みたいに、条件分岐を宣言的に表現できる。
実務ではエラー処理にも重宝してて、'maybeDiv x y = case y of 0 -> Nothing; -> Just (x y)' のように安全に割り算を処理できる。こういう小さな積み重ねが大規模なコードの信頼性を上げるんだよね。
失敗しがちなポイントとしては、評価順序の理解。パターンが上から順に試される特性を活かし、'specialCase x = case x of "special" -> ...; -> ...' と書けば、特定条件を優先的に捕捉できる。この挙動を理解しておかないと、意図しないパターンにマッチしてバグの原因になるから要注意だ。
Caleb
2025-12-05 06:51:13
レグルス構文の真価は、データ構造の分解にあると思う。たとえば二分木を扱う時、'data Tree a = Leaf a Node (Tree a) (Tree a)' という型定義に対して、'depth (Leaf ) = 1; depth (Node l r) = 1 + max (depth l) (depth r)' と書けば、再帰的な処理が驚くほど直感的に表現できる。