gpt4 book ai didi

Haskell 严格字段

转载 作者:行者123 更新时间:2023-12-04 23:13:48 27 4
gpt4 key购买 nike

定义惰性字段时,没有异常(exception),直到您打印它。

> 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本身定义了一个惰性绑定(bind)——let从不单独评估任何东西(除非使用 BangPatterns)。

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

您可以像这样区分严格构造函数和惰性构造函数:
ghci> T undefined `seq` ()
()
ghci> X undefined `seq` ()
*** Exception: Prelude.undefined

关于Haskell 严格字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49044362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com