>>598
1)
> 同じ様にスタックを必要としてしまうからだ。
ここがおかしい。

sum (x:xs) = x + sum xs
の場合は、xがスタックに置かれるから stack overflow の可能性はあるけど、
sum (x:xs) s = sum xs (x + s)
の場合はスタックの上のxはtailcallで上書きされるから、stack overflow にはならんと思うよ。
失礼ですが、tailcallをよくわかってない気がする。

2)
sum [] s = s
は s で渡されたクロージャーが返ってくるだけで、ここでは計算は起こらない。
計算が起こるのは基本的に、プリミティブの演算が行われるときと、適用する関数を
評価するときで、関数から返る値は評価されない。
失礼ですが、遅延評価もよくわかってない気がする。

-- MLスレで遅延評価の話ばっかりして非常に申し訳ないと思っています。