我对现实世界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在这个函数中,L和L8似乎可以互换使用,如果我用L8替换L (特别是对于L.ByteString和L8.ByteString类型),那么编译得很好,我在hackage中看到,它们链接到相同的源,这意味着Data.ByteString.Lazy.Char8.ByteString和Data.ByteString.Lazy.ByteString是一样的吗?为什么这里使用L8.isPrefixOf,而不使用L.isPrefixOf
发布于 2014-03-04 16:55:12
有趣的是,我使用了所有的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创建字符串输出。
当然,有些东西是不一样的,当你尝试创建一个ByteString时,你可以看到-
B.pack "abcd" -- This fails
B.pack [65, 66, 67, 68] -- output is "ABCD"
B8.pack "abcd" -- This works发布于 2014-03-04 16:36:47
根据文档,Lazy.ByteString和Lazy.Char.ByteString都是Word8向量的空间高效表示,支持许多有效的操作。因此,在内部,它们似乎是相同的,您可以交替使用它们。
但是,Lazy.Char.ByteString还具有以下特性:
ByteString类型提供了一个IsString实例,使您能够使用字符串文本,并将它们隐式打包到ByteStrings中。(您应该为此启用OverloadedStrings扩展)https://stackoverflow.com/questions/22176647
复制相似问题