例如,这不是尾调用:
map _ [] = []
map f (x : xs) = f x : map f xs
由数据构造函数保护的递归调用(:)
,因此它不会像其他语言中的等价物那样建立一个巨大的堆栈。它是这样工作的:
map (+1) (1 : 2 : 3 : [])
2 : map (+1) (2 : 3 : [])
2 : 3 : map (+1) (3 : [])
2 : 3 : 4 : map (+1) []
2 : 3 : 4 : []
为什么不
map (+1) (1 : 2 : 3 : [])
2 : map (+1) (2 : 3 : [])
2 : (3 : map (+1) (3 : []))
2 : (3 : (4 : map (+1) []))
2 : (3 : (4 : []))
2 : (3 : [4])
2 : [3, 4]
[2, 3, 4]
它与WHNF有关,但我仍然不能很好地理解它:(