感叹号在数据类型中起什么作用?

Mai*_*ein 7 haskell

我是 Haskell 的新手,今天我阅读了 OpenGL 源代码,发现了这个

data VertexArrayDescriptor a =
   VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a)
   deriving ( Eq, Ord, Show )
Run Code Online (Sandbox Code Playgroud)

http://hackage.haskell.org/package/OpenGL-2.9.1.0/docs/src/Graphics-Rendering-OpenGL-GL-VertexArrays.html#VertexArrayDescriptor

我尝试搜索它并发现http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/bang-patterns.html,但它可能有所不同。

它有什么作用?它是做什么用的?

Pog*_*dis 7

它是为了让在 Haskell 中编写严格的程序变得更容易,并使严格性更方便开发人员避免仅仅为了方便而被迫变得“懒惰”或不严格。

举个例子:

> data PNat = PZero | PSuc !Nat deriving Show
Run Code Online (Sandbox Code Playgroud)

bang 声明PSuc其参数是严格的,即 PSuc Bottom = Bottom(其中 Bottom 是非终止表达式)。

它是为了表明模式的严格性:

f !x !y = x + y
Run Code Online (Sandbox Code Playgroud)

很好的参考:https ://ghc.haskell.org/trac/haskell-prime/wiki/BangPatterns

  • FWIW,爆炸模式强制评估第一个构造函数([WHNF](http://www.haskell.org/haskellwiki/Weak_head_normal_form))。完全强制评估结构检查[`deepseq`](http://hackage.haskell.org/package/deepseq) (2认同)