数据类型中的感叹号符号有什么作用?

7

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

data VertexArrayDescriptor a =
   VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a)
   deriving ( Eq, Ord, Show )

我尝试搜索并找到了http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/bang-patterns.html,但它可能与这次不同。
那么VertexArrayDescriptor是做什么的?它有何作用?请参见http://hackage.haskell.org/package/OpenGL-2.9.1.0/docs/src/Graphics-Rendering-OpenGL-GL-VertexArrays.html#VertexArrayDescriptor
1个回答

7

它旨在使在Haskell中编写严格程序更加容易,并使开发人员更方便地避免出于便利而被迫变得“懒惰”或非严格。

以以下示例为例:

> data PNat = PZero | PSuc !Nat deriving Show

感叹号(bang)表示PSuc在其参数上是严格的,即PSuc bottom = bottom(其中bottom是一个非终止表达式)。

它用于指示模式的严格性:

f !x !y = x + y

参考资料: https://ghc.haskell.org/trac/haskell-prime/wiki/BangPatterns

这是一个关于Haskell语言中Bang模式的有用参考。Bang模式可以在代码中强制求值,以提高性能并减少懒惰计算的开销。如果你正在学习Haskell编程,这个参考将帮助你理解Bang模式的概念和用法。

2
值得一提的是,感叹号模式强制求值第一个构造器(WHNF)。要完全强制求值结构,请检查 deepseq - Danny Navarro
1
你的回答混合了Bang Patterns和Strictness Flags。 - typetetris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接