Haskell のすべての関数は末尾再帰であるべきだと思いました。
非末尾再帰関数として実装された階乗関数:
fact 0 = 1
fact n = n * fact (n - 1)
すべての演算子も関数なので、これは次と同等です
fact 0 = 1
fact n = (*) n (fact (n - 1))
しかし、これは明らかに私にとってテールコールです。すべての呼び出しがヒープに新しいサンクを作成するだけなのに、なぜこのコードがスタック オーバーフローを引き起こすのか疑問に思います。ヒープ オーバーフローは発生しませんか?