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