haskell $!运算符和无限列表

标签 haskell lazy-evaluation

我读到$!运营商强制严格评估。那么为什么这仍然有效?

Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]

我本以为 ghc 会永远努力去评估无限的 1 列表。

最佳答案

$! 强制其第二个参数为弱头范式,这基本上意味着它会计算其参数的最外层构造函数。因此,在您的情况下,它不会强制评估整个列表,而只会评估最外层(即第一个) : 构造函数。

Haskell: What is Weak Head Normal Form? 对范式与 WHNF 有很好的解释。 .

请注意,如果您强制评估整个列表(例如,使用 Control.DeepSeq 模块中的 $!! 运算符),您的程序将不会终止:

λ: import Control.DeepSeq (($!!))
λ: take 10 $!! repeat 1
^C

关于 haskell $!运算符和无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611594/

相关文章:

c++ - boost eval_if 的惰性评估

clojure - Clojure 中的延迟评估

来自 JPA 的 Java Lambda 迭代列表

Haskell - 将列表转换为带有索引的对象列表

haskell - 要么是 b。两年后的不同 Hoogle 结果?

testing - 如何在 cabal 测试中使用 detailed-0.9

javascript - 如何查询NodeJS流 'meta data'?

clojure - 在clojure中查看部分数据是否懒惰

java - 如何获取每个无序元素对,而不懒惰地从两个列表中重复?

function - 使用 Haskell 创建高阶函数