缺少严格字段的​​GHC错误

时间:2018-04-08 06:25:39

标签: haskell strictness

我正在阅读this article。它写着:

  

使用记录语法构造值时,如果忘记严格字段,GHC将给出错误。它只会给你一个非严格字段的​​警告。

有人能给我一个具体的例子吗?

1 个答案:

答案 0 :(得分:4)

一个简单的例子:

GHCi> data Foo = Foo { bar :: !Int, baz :: String } deriving Show

bar是严格字段,而baz是非严格字段。首先,让我们忘记baz

GHCi> x = Foo { bar = 3 }

<interactive>:49:5: warning: [-Wmissing-fields]
    * Fields of `Foo' not initialised: baz
    * In the expression: Foo {bar = 3}
      In an equation for `x': x = Foo {bar = 3}

我们收到警告,但x已构建完毕。 (注意,在使用stack ghci时,默认情况下会在GHCi中打印警告。您可能必须使用:set -Wall在纯GHCi中查看它;我不完全确定。)尝试使用{{1 baz中{}}自然让我们陷入困境......

x

......虽然我们可以很快到达GHCi> x Foo {bar = 3, baz = "*** Exception: <interactive>:49:5-19: Missing field in record construction baz

bar

但是,如果我们忘记GHCi> bar x 3 ,我们甚至无法构建值以开始:

bar