Haskell bang符号在数据类型中起什么作用?

Haskell bang符号在数据类型中起什么作用?,haskell,Haskell,我是Haskell的新手,今天我通读了OpenGL源代码,发现了这个 data VertexArrayDescriptor a = VertexArrayDescriptor !NumComponents !DataType !Stride !(Ptr a) deriving ( Eq, Ord, Show ) 我试着寻找它,发现了它,但它可能是不同的东西 它有什么作用?它的目的是什么?它使用Haskell编写严格的程序变得更容易,并使严格更方便开发人员,以避免仅仅为了方便而被迫

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

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

我试着寻找它,发现了它,但它可能是不同的东西


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

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

例如:

> data PNat = PZero | PSuc !Nat deriving Show
bang声明,
PSuc
在其参数中是严格的,即PSuc bottom=bottom(其中bottom是一个非终止表达式)

表示图案的严格程度:

f !x !y = x + y

很好的参考:

FWIW,bang模式强制计算第一个构造函数()。要完全强制对结构进行评估,请检查您的答案和模式