遅延評価によるメモ化がいつ行われるのかがよくわかりません。
サンク? とかいうのが関係してるらしいのですが…

f1 = trace "f1"
f2 = trace "f2" 1 -- once.
f3 n = trace "f3" n
f4 = trace "f4" (+1) -- once.
f5 n =(trace "f5" (+1)) n
main = print $
f2 + f2 + f3 0 + f3 0
+ f1 0 + f1 0 + f4 0 + f4 0
+ f5 0 + f5 0
{--
*Main Debug.Trace> :main
f2
f3
f3
f1
f1
f4
f5
f5
6
--}