【问题标题】:Haskell Strict fieldsHaskell 严格字段
【发布时间】:2018-03-01 07:09:58
【问题描述】:

定义惰性字段时,没有例外,直到你打印它。

> 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

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

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

    您可以像这样区分严格构造函数和惰性构造函数:

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

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2017-09-25
      相关资源
      最近更新 更多