>>648
f x = f ...
みたいに、右辺の一番外側が自分自身を呼んでいればいい
ただし、caseとlet(や、構文糖であるifとwhere)が挟まっていてもok
f x = case x of [] -> 1; hd:tl -> f tl
みたいに

この形でなくても末尾再帰になることもあって、例えば
f x = putStrLn x >> f
だと、一番外側の呼び出しは(>>)だけど、IOモナドの(>>)ならfを一番外側で呼ぶので、
間接的に末尾再帰になる