Haskell严格的字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell严格的字段相关的知识,希望对你有一定的参考价值。

定义惰性字段时,在打印之前没有异常。

> data T = T Int deriving (Show)
> let t = T undefined
> t
T *** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at <interactive>:3:7 in interactive:Ghci3

有了严格的字段(!Int),我认为undefined会被立即评估,这将导致异常,但实际上,它仍然没有评估,直到你打印它。这是为什么?

> data X = X !Int deriving (Show)
> let x = X undefined
> x
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at <interactive>:6:11 in interactive:Ghci5
答案

因为let本身定义了一个懒惰的绑定 - let从不评估任何东西(除非使用BangPatterns)。

ghci> let x = undefined
ghci> x
*** Exception: Prelude.undefined

您可以区分严格和惰性构造函数,如下所示:

ghci> T undefined `seq` ()
()
ghci> X undefined `seq` ()
*** Exception: Prelude.undefined

以上是关于Haskell严格的字段的主要内容,如果未能解决你的问题,请参考以下文章

Haskell:使用严格性的指南

是否有使用严格评估的 Haskell 编译器或预处理器?

为啥这个 Haskell 程序表现如此糟糕?

在 Haskell 中自动插入惰性

哈斯克尔。我很困惑这个代码片段是如何工作的

Haskell“资源缩减”