假設我有:是Data.ByteString.Lazy追加懶惰?
import qualified Data.ByteString.Lazy as L
bs1 :: L.ByteString
bs2 :: L.ByteString
是L.append bs1 bs2
也懶,這將不會導致我立即消耗所有BS1的?與L.concat
類似,而不像L.length
,我知道它會導致它消耗整個字節串,因爲它需要計算所有字節。
假設我有:是Data.ByteString.Lazy追加懶惰?
import qualified Data.ByteString.Lazy as L
bs1 :: L.ByteString
bs2 :: L.ByteString
是L.append bs1 bs2
也懶,這將不會導致我立即消耗所有BS1的?與L.concat
類似,而不像L.length
,我知道它會導致它消耗整個字節串,因爲它需要計算所有字節。
確定函數是如何懶惰的一個簡單方法是傳遞它的部分定義值。例如,讓我們定義一個塊的懶惰字節串,然後是一個未定義的尾部。
*Main> let bs1 = L.fromChunks $ B.pack [102, 111, 111] : undefined
*Main> bs1
Chunk "foo" *** Exception: Prelude.undefined
正如您所看到的,嘗試打印它會在第一個塊後引發異常。現在,讓我們定義另一個懶惰的ByteString並嘗試附加它們。
*Main> let bs2 = L.pack [98, 97, 114]
*Main> L.append bs1 bs2
Chunk "foo" *** Exception: Prelude.undefined
L.append
能夠產生結果惰性ByteString的第一個塊。這意味着它只需要查看第一塊bs1
即可產生結果的第一部分,即它與您預期的一樣懶。
是的,append和concat是懶惰的,它們只會在需要時觸碰塊。 bs1的第一部分是立即需要的,第二部分(如果存在)當第一部分被消耗時等。