我刚试过这个:
Prelude> [x*2|x<-[1..10]]
[2,4,6,8,10,12,14,16,18,20]
好吧,它似乎不像 F# 的“seq”,它是惰性求值的。这里这个集合中的所有元素都被打印出来了,所以看起来“列表理解”是急切的评估。
如果我想建立一个“懒惰评估”的怎么办?
谢谢。
最佳答案
在 Haskell 中,一切(几乎)都是懒惰的,这没什么区别
但是如果你让 GHCi 打印它(你用输入做了),它会评估所有的
要查看它,请使用以下命令:
Prelude> let xs = [x*2|x<-[1..10]]
Prelude> :sprint xs
xs = _
_
此处表示未评估的 thunk顺便说一句:这就是 Haskell 对这样的事情没有任何问题的原因:
let xs = [x*2|x<-[1..]]
这是一个无限列表 - 现在如果你要求它打印出来它需要一些时间;)
F# 的
seq { ... }
也是如此但不适用于 F# 的列表!
关于list - Haskell: "list comprehension"是否使用急切求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169338/