Haskellはデフォルトで遅延評価ですから、実装に関することは全部後で書くことになっているのですよ。 - 普通(って何が普通か知りませんが、私が普通だと思っている普通)は、末尾再帰の最適化というのは、次のような疑似アセンブリが FUNC_A: いろいろ処理 CALL FUNC_B RETというところを、CALLのあとすぐにRETだからこれってJMPで置き換えられるよね、ということで FUNC_A: いろいろ処理 JMP FUNC_Bとなることや、CPS(ちゃんと勉強してないので気分だけですが)で書いたときに (define (func-a cont) いろいろ処理 (func-b (lambda () (cont)))) というところを、func-bの引数のlambdaって要らないよね、ということで、 (define (func-a cont) いろいろ処理 (func-b cont))