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严格的字段的主要内容,如果未能解决你的问题,请参考以下文章