【发布时间】:2011-06-03 19:36:21
【问题描述】:
我正在启动 Haskell,并正在研究一些用“!”定义数据类型的库。来自字节串库的示例:
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
现在我看到 this question 来解释这意味着什么,我想这很容易理解。但我现在的问题是:使用它有什么意义?既然表达式会在需要时被评估,为什么要强制提前评估?
在这个问题的第二个答案中,C.V.汉森说:“[...] 有时懒惰的开销可能太多或浪费”。是不是说它是用来节省内存的(保存值比保存表达式便宜)?
一个解释和一个例子会很棒!
谢谢!
[EDIT] 我想我应该选择没有 {-# UNPACK #-} 的示例。所以让我自己做一个。这会有意义吗?是的,为什么以及在什么情况下?
data MyType = Const1 !Int
| Const2 !Double
| Const3 !SomeOtherDataTypeMaybeMoreComplex
【问题讨论】:
-
惰性会对代码产生很多影响,主要是惰性程序通常在线性空间中运行,而严格程序需要恒定空间。但在您的示例中,真正的原因可能与有问题的数据被不知道如何强制延迟评估的外部函数操作有关。
-
不。 ForeignPtr 可以传递给外部函数,当然,但不能传递给结构本身——即使有严格/解包注释,也没有为本地 haskell 结构定义 ABI