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 !Char
和goom :: Foo -> (Grump, Int); goom (Foo b) = (Grump b 't', 7)
。当结果对被强制时,这将完全由构造函数和原语构建结果对。但是,如果 Foo
的字段是惰性的,那么强制结果对将在第一个组件中放置一个 thunk,当强制时,将强制 Bar
并构建 Grump
.严格的字段对于减少常数因子非常有帮助。以上是关于Haskell 类型声明中的符号 `!` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章