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

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

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

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

【问题讨论】:

    标签: haskell types functional-programming programming-languages type-systems


    【解决方案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 .严格的字段对于减少常数因子非常有帮助。
    猜你喜欢
    • 2010-11-02
    • 2017-01-09
    • 1970-01-01
    • 2014-08-27
    • 2012-02-26
    • 2019-06-21
    • 2015-11-01
    相关资源
    最近更新 更多