«Вызов по имени» - это стратегия нестрогой оценки без запоминания где значение (значения) аргумента (ов) нужно найти только при фактическом использовании внутри тело функции, каждый раз заново:
h x = x : (h x)
g xs = [head xs, head xs - 1]
g (h 2) = let {xs = (h 2)} in [head xs, head xs - 1]
= [let {xs = (h 2)} in head xs, let {xs = (h 2)} in head xs - 1]
= [head (h 2), let {xs = (h 2)} in head xs - 1]
= [head (let {x = 2} in x : (h x)}), let {xs = (h 2)} in head xs - 1]
= [let {x = 2} in x, let {xs = (h 2)} in head xs - 1]
= [2, let {xs = (h 2)} in head xs - 1]
= ....
«Вызов по необходимости» - это запоминание нестрогой или «ленивой» стратегии оценки где значение (значения) аргумента (ов) должны быть найдены только при использовании внутри тела функции в первый раз , а затем доступны для дальнейшего использования:
h x = x : (h x)
g xs = [head xs, head xs - 1]
g (h 2) = let {xs = (h 2)} in [head xs, head xs - 1]
= let {xs = (2 : (h 2))} in [head xs, head xs - 1]
= let {xs = (2 : (h 2))} in [2, head xs - 1]
= ....
«Вызов по значению» - это строгая оценка стратегия , где значение (а) аргумента (ов) должно быть найдено до ввода тела функции:
h x = x : (h x)
g xs = [head xs, head xs - 1]
g (h 2) = let {xs = (h 2)} in [head xs, head xs - 1]
= let {xs = (2 : (h 2))} in [head xs, head xs - 1]
= let {xs = (2 : (2 : (h 2)))} in [head xs, head xs - 1]
= let {xs = (2 : (2 : (2 : (h 2))))} in [head xs, head xs - 1]
= ....
Все вышеперечисленное предполагает, что g (h 2)
вводится в приглашение GHCi, поэтому оно должно быть распечатано полностью.