Haskell 中的类型声明中的符号 `!` 是什么意思?

What does the symbol `!` mean in type declarations in Haskell?

在我对 Haskell 的研究中,我看到了类型声明中使用的符号 !。看一个例子:

data Foo = MkFoo
  { _bar :: !Bar
    , ...
  }

我的问题是:为什么要使用它,与没有它的声明有什么区别?

标有感叹号的字段在相关构造函数的应用程序站点上变得严格。例如,您的数据声明将与没有 ! 完全相同,但在您的代码使用 MkFoo:

的任何地方编写以下内容
bar `seq` MkFoo { _bar = bar }

完整详情为 in the Report