簡體   English   中英

是什么讓 Bytestring 變得“懶惰”?

[英]What makes a Bytestring "lazy"?

我正在學習 Haskell 但很難理解惰性 ByteStrings 的工作原理。 Hackage說“Lazy ByteStrings 使用嚴格塊的惰性列表,使其適用於 I/O 流任務”。 相反,嚴格列表存儲為一個大數組。

惰性字節串中的這些“塊”是什么? 您的編譯器如何知道塊應該有多大? 此外,我了解惰性列表背后的想法是您不必存儲整個事物,因此允許無限列表等等。 但是這個存儲是如何實現的呢? 每個塊是否都有指向下一個塊的指針?

非常感謝您的幫助:)

您可以在此處找到惰性ByteString的定義

data ByteString = Empty | Chunk {-# UNPACK #-} !S.ByteString ByteString
    deriving (Typeable)

所以Chunk是一個數據構造函數 - 第一部分是一個嚴格的 ( ! ) strict ( S. ) ByteString ,然后是一些更多的ChunksEmpty通過第二個遞歸(惰性) ByteString部分。

請注意,第二部分沒有(!) - 所以這可能是一個GHC thunk (Haskell 中的懶惰的東西),只有在您需要它時才會強制執行(例如對其進行模式匹配)。

這意味着惰性ByteString要么是Empty的,要么你得到一個嚴格的(如果你願意,你可以認為這是已經加載的)部分或完整字符串的一部分,帶有惰性的剩余/休息/尾部ByteString

至於取決於生成這個惰性字節串的代碼的大小 - 編譯器不會參與其中。

您可以在hGetContents中看到這一點:

hGetContents = hGetContentsN defaultChunkSize

其中defaultChunkSize定義為32 * 1024 - 2 * sizeOf (undefined:: Int) - 所以略小於32kB

是的, restChunk的 snd.參數)可以看作是指向下一個ChunkEmpty的指針(就像普通列表一樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM