階乗

Haskell の参考書とかを見ていると階乗を再帰関数の練習として載せているものが多いが、ぶっちゃけて

fact :: Int -> Int
fact n = product [1..n]

で良かったりする。で、これだと n が 0 のとき困るんじゃないの、って思った人もいると思うんだけど、GHCi で

> product [1..0]

って叩いたら 1 って返ってきたので大丈夫です。やはり Haskell は神の言語としか思えない。

種明かし

[1..0]

の正体は空リストです。そして

product = foldl (*) 1

foldl _ v [] = v

を組み合わせるとこのような結果になります。