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

Posted

技术标签:

【中文标题】Haskell 类型声明中的符号 `!` 是啥意思?【英文标题】:What does the symbol `!` mean in type declarations in Haskell?Haskell 类型声明中的符号 `!` 是什么意思? 【发布时间】:2022-01-02 03:23:22 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

用感叹号标记的字段在关联构造函数的应用程序站点上是严格的。例如,您的数据声明将与没有 ! 的情况完全相同,但在您的代码使用 MkFoo 的任何地方编写以下内容:

bar `seq` MkFoo  _bar = bar 

详细信息in the Report。

【讨论】:

值得注意的是,使字段严格的主要原因通常是this allows the compiler to unbox the stored values,即,而不是存储指向 thunk/value 的指针(在例如 Int 的情况下会消耗尽可能多的空间作为值本身!),您将整数存储在适当的位置。 语义上,是的。在操作上,没有。编译器知道已经评估了一个严格的字段。假设你写data Grump = Grump !Bar !Chargoom :: Foo -> (Grump, Int); goom (Foo b) = (Grump b 't', 7)。当结果对被强制时,这将完全由构造函数和原语构建结果对。但是,如果 Foo 的字段是惰性的,那么强制结果对将在第一个组件中放置一个 thunk,当强制时,将强制 Bar 并构建 Grump .严格的字段对于减少常数因子非常有帮助。

以上是关于Haskell 类型声明中的符号 `!` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Rust 声明性宏中的 @ 符号是啥意思?

`undefined` 的类型签名在 Haskell 中是啥意思?

Haskell 中的“让”和“进入”是啥意思?

这个符号 `:>` 在 Coq 中是啥意思?

Rust 类型中的 & 符号是啥意思?

C++11 中的 T&&(双 & 符号)是啥意思?