<分区>
我是这样想的:
[i | i <- [1..], i < 5]
会产生
[1, 2, 3, 4]
就像
take 4 [i | i <- [1..]]
一个有限长度的列表。
但事实并非如此,它似乎是无限的,因为任何将其视为有限列表的尝试都会导致挂起 (ghci)。
我不确定如何准确理解这一点。它是某种无限生成器,在第四项之后什么都不生成,但永不停止吗?
基本上代码会不断生成新项目,因为它不知道它们永远无法满足标准?
标签 haskell
<分区>
我是这样想的:
[i | i <- [1..], i < 5]
会产生
[1, 2, 3, 4]
就像
take 4 [i | i <- [1..]]
一个有限长度的列表。
但事实并非如此,它似乎是无限的,因为任何将其视为有限列表的尝试都会导致挂起 (ghci)。
我不确定如何准确理解这一点。它是某种无限生成器,在第四项之后什么都不生成,但永不停止吗?
基本上代码会不断生成新项目,因为它不知道它们永远无法满足标准?
最佳答案
您从字面上告诉程序检查无限列表的每个元素,并仅包括小于 5 的元素。正如您所说,编译器没有意识到列表中没有剩余元素会满足条件。如果传递任意列表,即使在理论上,它也不能在运行时创建这样的证明。它只是按照您说的去做,并不断检查每个元素。
如果程序不尝试计算结果 1:2:3:4:xs
中的 xs
,这不一定是错误,因为延迟计算。取 head
应该没问题。但是,如果您告诉它查找列表的长度或类似的东西,它就是一个无限循环。
做您(可能?)想要的事情的一种方法是 takeWhile
,当条件不再为真时停止。
关于haskell - 列表理解中的守卫不会终止无限列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067151/