【发布时间】:2022-01-02 03:23:22
【问题描述】:
在我对 Haskell 的研究中,我看到了在类型声明中使用的符号 !。看一个例子:
data Foo = MkFoo
{ _bar :: !Bar
, ...
}
我的问题是:为什么要使用它?没有它的声明有什么区别?
【问题讨论】:
标签: haskell types functional-programming programming-languages type-systems
在我对 Haskell 的研究中,我看到了在类型声明中使用的符号 !。看一个例子:
data Foo = MkFoo
{ _bar :: !Bar
, ...
}
我的问题是:为什么要使用它?没有它的声明有什么区别?
【问题讨论】:
标签: haskell types functional-programming programming-languages type-systems
用感叹号标记的字段在关联构造函数的应用程序站点上是严格的。例如,您的数据声明将与没有 ! 的情况完全相同,但在您的代码使用 MkFoo 的任何地方编写以下内容:
bar `seq` MkFoo { _bar = bar }
详细信息in the Report。
【讨论】:
Int 的情况下会消耗尽可能多的空间作为值本身!),您将整数存储在适当的位置。
data Grump = Grump !Bar !Char 和goom :: Foo -> (Grump, Int); goom (Foo b) = (Grump b 't', 7)。当结果对被强制时,这将完全由构造函数和原语构建结果对。但是,如果 Foo 的字段是惰性的,那么强制结果对将在第一个组件中放置一个 thunk,当强制时,将强制 Bar 并构建 Grump .严格的字段对于减少常数因子非常有帮助。