例如,以下不是尾调用:
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有关,但我仍然无法理解它 :(
[...]
来表示一个完整的列表,这是我的理解。 - Will Ness