相关疑难解决方法(0)

如何在Haskell中过滤无限列表

可能重复:
对无限列表的有限理解

我无法理解为什么ghci无法正确计算此代码?

[x | x <- [1..], x < 1000]
Run Code Online (Sandbox Code Playgroud)

Ghci只是停在最后一个号码,我需要在命令行中断这个过程以恢复正常状态.怎么了?我希望这段代码可以工作,因为haskell的懒惰评估.

haskell

13
推荐指数
2
解决办法
2965
查看次数

Haskell:无限列表 - Haskell多么懒惰?

哈斯克尔有多懒惰?

为什么以下不知道何时停止?

sum ([n^2 | n <- [1..], odd (n^2), n^2 < 100])
Run Code Online (Sandbox Code Playgroud)

haskell

3
推荐指数
2
解决办法
220
查看次数

列表理解中的Haskell懒惰

我想得到所有偶数<= 1000的总和.

以下代码:

sum [x | x <- [1..1000], even x] (我知道可以用[2,4..1000]完成,这是为了练习)

报告总和是250500.

然而:

sum [x | x <- [1..], even x && x <= 1000]

从未完成,必须中断!

我认为我可以安全地编写[1..],这是一个无限的列表,因为Haskell不会尝试评估它.

此外,我认为它只是开始x x,检查并添加它们.

那么为什么上面的结果不能产生呢?

haskell list-comprehension range

2
推荐指数
1
解决办法
356
查看次数

了解Haskell懒惰评估

原谅我的愚蠢问题,我是Haskell的新手.

我在Haskell中尝试了以下内容:

sum [fib n| n <- [1..], (even (fib n) && fib n < 4000000)] 
Run Code Online (Sandbox Code Playgroud)

这需要无限的时间.如果我遗漏n <- [1..],解决方案立即出现.

我认为这无关紧要,因为Haskell正在评估懒惰.我是否误解了懒惰的评价?

haskell fibonacci lazy-evaluation

2
推荐指数
2
解决办法
129
查看次数

列表推导中的警卫不会终止无限列表?

我想这个:

[i | i <- [1..], i < 5]
Run Code Online (Sandbox Code Playgroud)

会产生

[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

就像

take 4 [i | i <- [1..]]
Run Code Online (Sandbox Code Playgroud)

有限长度列表.

但它没有,它似乎是无限的,因为任何将它视为有限列表的尝试只会导致挂起(ghci).

我不确定如何理解这一点.它是某种无限的发电机,它只是在第四项之后什么都不产生但从未停止过?

基本上代码不断生成新项目,因为它不知道它们永远不能满足标准?

haskell

1
推荐指数
1
解决办法
110
查看次数