list - Haskell: "list comprehension"是否使用急切求值?

标签 list haskell list-comprehension lazy-evaluation

我刚试过这个:

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/

相关文章:

python - 获取对象列表中属性值最大的对象列表

Haskell:数据类型

haskell - 将 IO 输出收集到列表中

string - 将前导零的haskell Int转换为String

python - 如果元组不包含 __iadd__ 但仍使用 INPLACE_ADD 指令,则就地添加如何在元组中工作?

Python:在列表中搜索值

Python 列表理解返回列表的边缘值

列出 :append with list comprehensions

C# 将 linq 列表 (int) 项更改为 (string)

python - python中列表理解的补充