我无法理解这个简单的代码片段:

-- 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 的调用,这意味着以下内容:
go1go2 首先使用两个参数调用: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/

10-13 04:16