[英]What makes a Bytestring "lazy"?
我正在學習 Haskell 但很難理解惰性 ByteStrings 的工作原理。 Hackage說“Lazy ByteStrings 使用嚴格塊的惰性列表,使其適用於 I/O 流任務”。 相反,嚴格列表存儲為一個大數組。
惰性字節串中的這些“塊”是什么? 您的編譯器如何知道塊應該有多大? 此外,我了解惰性列表背后的想法是您不必存儲整個事物,因此允許無限列表等等。 但是這個存儲是如何實現的呢? 每個塊是否都有指向下一個塊的指針?
非常感謝您的幫助:)
data ByteString = Empty | Chunk {-# UNPACK #-} !S.ByteString ByteString
deriving (Typeable)
所以Chunk
是一個數據構造函數 - 第一部分是一個嚴格的 ( !
) strict ( S.
) ByteString
,然后是一些更多的Chunks
或Empty
通過第二個遞歸(惰性) ByteString
部分。
請注意,第二部分沒有(!)
- 所以這可能是一個GHC thunk (Haskell 中的懶惰的東西),只有在您需要它時才會強制執行(例如對其進行模式匹配)。
這意味着惰性ByteString
要么是Empty
的,要么你得到一個嚴格的(如果你願意,你可以認為這是已經加載的)部分或完整字符串的一部分,帶有惰性的剩余/休息/尾部ByteString
。
至於取決於生成這個惰性字節串的代碼的大小 - 編譯器不會參與其中。
您可以在hGetContents
中看到這一點:
hGetContents = hGetContentsN defaultChunkSize
其中defaultChunkSize
定義為32 * 1024 - 2 * sizeOf (undefined:: Int)
- 所以略小於32kB
是的, rest ( Chunk
的 snd.參數)可以看作是指向下一個Chunk
或Empty
的指針(就像普通列表一樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.