我是 Haskell 的新手,今天我阅读了 OpenGL 源代码,发现了这个
data VertexArrayDescriptor a =
VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a)
deriving ( Eq, Ord, Show )
Run Code Online (Sandbox Code Playgroud)
我尝试搜索它并发现http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/bang-patterns.html,但它可能有所不同。
它有什么作用?它是做什么用的?
它是为了让在 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
| 归档时间: |
|
| 查看次数: |
1273 次 |
| 最近记录: |