Haskell严格的字段

Leo*_*ang 4 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
Run Code Online (Sandbox Code Playgroud)

使用严格的field(!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
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 8

因为let它本身定义了一个惰性绑定 - let永远不会自己评估任何东西(除非BangPatterns使用).

ghci> let x = undefined
ghci> x
*** Exception: Prelude.undefined
Run Code Online (Sandbox Code Playgroud)

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

ghci> T undefined `seq` ()
()
ghci> X undefined `seq` ()
*** Exception: Prelude.undefined
Run Code Online (Sandbox Code Playgroud)