Haskell:列表理解"使用急切的评价?

时间:2016-02-03 05:42:28

标签: list haskell list-comprehension lazy-evaluation

我刚试过这个:

Prelude> [x*2|x<-[1..10]]
[2,4,6,8,10,12,14,16,18,20]

好吧看起来不像F#&#34; seq&#34;这是懒惰的评价。这里的所有元素都打印出来了,所以看起来像#34; list comprehension&#34;是热切的评价。

如果我希望建立一个&#34;懒惰的评估&#34;一? 感谢。

2 个答案:

答案 0 :(得分:11)

在Haskell 一切(好吧差不多)是懒惰的,这没什么区别

但是如果你要求GHCi打印它(你输入的话)它将评估所有这些

要看到它使用它:

Prelude> let xs = [x*2|x<-[1..10]]
Prelude> :sprint xs
xs = _

_表示未评估的 thunk

BTW:这就是为什么Haskell没有这样的问题:

let xs = [x*2|x<-[1..]]

这是一个无限的列表 - 现在如果你要求它打印出来它会需要一些时间;)

F#的seq { ... }也是如此,但F#的名单却不是这样!

答案 1 :(得分:4)

您可以通过询问无限列表来自行测试:

Prelude> take 10 [ x*2 | x <- [1..], x `mod` 3 == 0 ]
[6,12,18,24,30,36,42,48,54,60]