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
似乎L
和L8
可以在此函数的某处互换使用,如果我将L
替换为L8
,则编译正常,特别是L.ByteString
类型和L8.ByteString
,我在hackage中看到,它们与相同的来源相关联,这是否意味着Data.ByteString.Lazy.Char8.ByteString
与Data.ByteString.Lazy.ByteString
相同?为什么L8.isPrefixOf
在这里使用而不是L.isPrefixOf
?
答案 0 :(得分:4)
根据documentation,Lazy.ByteString
和Lazy.Char.ByteString
都是Word8
向量的节省空间的表示,支持许多有效的操作。因此,在内部它们似乎是相同的,您可以互换使用它们。
但Lazy.Char.ByteString
还有以下这些特征:
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