2011-11-11 83 views
2

假設我有:是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,我知道它會導致它消耗整個字節串,因爲它需要計算所有字節。

回答

8

確定函數是如何懶惰的一個簡單方法是傳遞它的部分定義值。例如,讓我們定義一個塊的懶惰字節串,然後是一個未定義的尾部。

*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即可產生結果的第一部分,即它與您預期的一樣懶。

1

是的,append和concat是懶惰的,它們只會在需要時觸碰塊。 bs1的第一部分是立即需要的,第二部分(如果存在)當第一部分被消耗時等。