末尾再帰
tail recursive
末尾呼び出しでかつ、その呼び出しが
再帰になっているもの
具体例
example.cfunction foo(data) {
a(data);
return foo(data);
}
この foo
は末尾呼び出しで、かつ再帰呼び出しをしている
hssum :: Num a => [a] -> a
sum xs = sum' xs 0
where
sum' [] r = r
sum' (y:ys) r = sum' ys (y+r)
r
は状態として機能している

sum'
の定義が末尾再帰になっている
=
のすぐ右に sum'
(自分自身)が来ているのがポイント
= sum' ...
になっている
末尾再帰じゃない例
hssum [] = 0
sum (x:xs) = (+) x (sum xs)
ただの再帰関数を、末尾再帰に変換すること、はなんと呼ぶのか
継続で言う、CPS変換的な
末尾再帰にするのが嬉しい場合
この記事を雑に読む感じ以下の場合で話が全く異なる
その言語が遅延評価をするかどうか
その関数がリストを生成するのか、数値を生成するのか

pp.82-83にもちょっと書いてる
monad