Haskell で書くと、
fac n = facRec n 1
where facRec 0 acc = acc
facRec n acc = facRec (n-1) (acc*n)
GHCでコンパイルすると、結果は私が使用した場合とは異なりますか
fac 0 = 1
fac n = n * fac (n-1)
私は簡単にすべてを実行fac n = product [1..n]
して回避することができましたが、末尾再帰の試みが怠惰な言語でどのように機能するかに興味があります。サンクが蓄積されているため、スタック オーバーフローが発生する可能性があることはわかりましたが、アキュムレータを使用した場合と単純な再帰を述べた場合では、(コンパイルされたプログラムの結果に関して) 実際には何か違うことが起こりますか? 読みやすさの向上以外に、末尾再帰を除外する利点はありますか? runhaskell
最初にコンパイルするのではなく、計算を実行するために使用している場合、答えはまったく変わりますか?