我開始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