我开始Haskell,正在看一些数据类型用“!”定义的库。从字节串库的例子:严格声明的要点是什么?
data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
{-# UNPACK #-} !Int -- offset
{-# UNPACK #-} !Int -- length
现在我看到this question作为这意味着什么解释,我想这是很容易理解的。但我现在的问题是:使用这个的意义何在?既然表达式会在需要时进行评估,为什么要强制早期评估呢?
在对这个问题的第二个答案C.V.汉森说:“有时懒惰的开销可能太多或浪费了”。这是否意味着它用于节省内存(保存该值比保存表达式更便宜)?
一个解释和一个例子会很棒!
谢谢!
[编辑]我想我应该选择一个没有{ - #UNPACK# - }的例子。所以让我自己做一个。这会有道理吗?是的,为什么和在什么情况下?
data MyType = Const1 !Int
| Const2 !Double
| Const3 !SomeOtherDataTypeMaybeMoreComplex
懒惰可以对代码产生很大的影响,主要的原因是当严格程序需要恒定的空间时,懒惰程序通常在线性空间中运行。但在你的例子中,真正的原因可能与外部函数操纵的数据有关,这些外部函数不知道如何强制懒惰评估。 – 2011-06-03 19:45:24
没有。ForeignPtr可以传递给外部函数,当然,但不是结构本身 - 即使是严格/解压缩注释,没有为本地haskell结构定义ABI – bdonlan 2011-06-03 19:51:00