【问题标题】:Haskell $! operator and infinite lists哈斯克尔$!运算符和无限列表
【发布时间】:2014-05-12 14:22:29
【问题描述】:

我读到 $!操作员强制进行严格的评估。那么为什么这仍然有效?

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

我期待 ghc 永远努力评估无限的 1 列表。

【问题讨论】:

    标签: haskell lazy-evaluation


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Weak Head Normal Form 上的链接 SO 线程非常适合阅读,谢谢!
    • 还要注意take n,对于n > 0,无论如何都必须将列表强制为WHNF,因此take 10 $! repeat 1在操作上与take 10 $ repeat 1相同。
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多