Haskellで、与えられた数値リストを合計する”再帰”を使ったシンプルな関数を書きます。
sum_recursive.hs
sum_recursive :: Num a => [a] -> a
sum_recursive [] = 0
sum_recursive (x:xs) = x + sum_recursive xs
自明な事実、
sum_recursive [x] = xを、評価し検証してみます。
sum_recursive [x]
= {sum_recursiveを適用}
x + sum_recursive []
= {sum_recursiveを適用}
x + 0
= { + を適用 }
x
その〜、たった要素一つのリストを評価するために”再帰”してるわけですが、
こんな風な⬇コトした日には、スタックオーバーフローしちゃうわけです。
replicateは、指定した要素をn個持つリストを生成するのですが、
この場合、1億個の1を保持するリストを生成、その合計を再帰を使って、
算出しようと試みるも、あえなく撃沈w
stack-overflow
sum_recursive (replicate 100000000 1)
そりゃ、そうだ、どんだけ再帰してんだってハナシw
Haskellの魅力は、命令型言語になれきったアタマを新たなアイディアに置き換える
ことにあるなって思います。