Lazy.ByteString和Lazy.Char8.ByteString之间的差异

时间:2014-03-04 15:52:20

标签: haskell

我对real world haskell

中的代码感到困惑
import qualified Data.ByteString.Lazy.Char8 as L8
import qualified Data.ByteString.Lazy as L

matchHeader :: L.ByteString -> L.ByteString -> Maybe L.ByteString
matchHeader prefix str
    | prefix `L8.isPrefixOf` str
        = Just (L8.dropWhile isSpace (L.drop (L.length prefix) str))
    | otherwise
        = Nothing

似乎LL8可以在此函数的某处互换使用,如果我将L替换为L8,则编译正常,特别是L.ByteString类型和L8.ByteString,我在hackage中看到,它们与相同的来源相关联,这是否意味着Data.ByteString.Lazy.Char8.ByteStringData.ByteString.Lazy.ByteString相同?为什么L8.isPrefixOf在这里使用而不是L.isPrefixOf

2 个答案:

答案 0 :(得分:4)

根据documentationLazy.ByteStringLazy.Char.ByteString都是Word8向量的节省空间的表示,支持许多有效的操作。因此,在内部它们似乎是相同的,您可以互换使用它们。

Lazy.Char.ByteString还有以下这些特征:

  • 所有字符将被截断为8位(所以要小心!)
  • bytestrings的Char8接口为IsString类型提供ByteString的实例,使您能够使用字符串文字,并将它们隐式打包到ByteStrings。 (您应为此启用OverloadedStrings分机号)

答案 1 :(得分:4)

这很有趣,我已经使用了所有的ByteStrings,但从未注意到(直到你提到)它的Char8和Word8版本在内部是相同的数据类型。

一旦提到,我不得不去查看代码.... Data / ByteString / Lazy / Char8.hs中的以下行显示不仅数据类型相同,而且许多函数都是同样地重新出口......

-- Functions transparently exported
import Data.ByteString.Lazy 
        (fromChunks, toChunks, fromStrict, toStrict
        ,empty,null,length,tail,init,append,reverse,transpose,cycle
        ,concat,take,drop,splitAt,intercalate,isPrefixOf,group,inits,tails,copy
        ,hGetContents, hGet, hPut, getContents
        ,hGetNonBlocking, hPutNonBlocking
        ,putStr, hPutStr, interact)

所以看起来大多数Data.ByteString。(懒惰。)?Char8只是Data.ByteString(.Lazy)的便利包装器?这也解释了为什么show总是为Word8 ByteStrings创建了stringy输出。

当然,有些东西确实有所不同,正如您在尝试创建ByteString时所看到的那样 -

B.pack "abcd"  -- This fails
B.pack [65, 66, 67, 68] -- output is "ABCD"
B8.pack "abcd"  -- This works