2011-11-11 36 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的第一部分是立即需要的,第二部分(如果存在)当第一部分被消耗时等。