我正在启动Haskell并且正在查看一些使用“!”定义数据类型的库。 bytestring库中的示例:
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
现在我看到了 这个问题 作为对这意味着什么的解释,我想这很容易理解。但我现在的问题是:使用它有什么意义?由于表达式将在需要时进行评估,为什么要强制进行早期评估?
在这个问题的第二个答案C.V.汉森说:“[...]有时懒惰的开销可能太多或浪费”。这是否意味着它用于节省内存(保存值比保存表达式便宜)?
一个解释和一个例子会很棒!
谢谢!
[编辑]我想我应该选择一个没有{ - #UNPACK# - }的例子。所以让我自己做一个。这会有意义吗?是的,为什么以及在什么情况下?
data MyType = Const1 !Int
| Const2 !Double
| Const3 !SomeOtherDataTypeMaybeMoreComplex