我无法理解这个简单的代码片段:
-- This works: foldr go1 [] [1..]
-- This doesn't: foldr go2 [] [1..]
go1 a b = a : b
go2 a [] = a : []
go2 a b = a : b
使用
go1
折叠立即开始返回值,但 go2
似乎在等待列表的末尾。显然,模式匹配导致某些事情以不同的方式处理。有人能解释一下这里到底发生了什么吗?
最佳答案
与 go1
不同,go2
检查它的第二个参数是否为空。为了做到这一点,需要评估第二个参数,至少足以确定它是否为空。
因此,对于您对 foldr
的调用,这意味着以下内容:go1
和 go2
首先使用两个参数调用:1 和 foldr go [] [2 ..]
的结果。在 go1
的情况下,第二个参数保持不变,因此 foldr
的结果只是 1 :: foldr go [] [2 ..]
,在访问尾部之前不会进一步评估尾部。
然而,在 go2
的情况下,需要评估 foldr go [] [2 ..]
以检查它是否为空。为了做到这一点,foldr go [] [3 ..]
然后需要出于同样的原因进行评估。等等,无止境。
关于list - 模式匹配和无限列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26705025/