haskell - 列表理解中的守卫不会终止无限列表?

标签 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/

相关文章:

haskell - 为什么函数的类型从 GHCi 中的 monad 出来时会发生变化

haskell - 为什么 monad 类型类中应该存在 fail 方法?

haskell - 如何在 Haskell 中按 '.' 拆分字符串,但如果句点介于两个数字之间,例如 : (2. 5) 则不要拆分?

haskell - Hask 甚至是一个类别吗?

Haskell 编译程序出现段错误

haskell - Haskell 中的非详尽模式,创建的数据类型

haskell - Haskell 中的组织同态示例

haskell - GHC : partially compile Haskell code?

list - 在 Haskell 中将列表一分为二的所有可能性

haskell - 如何在haskell中获取数字的一部分