gpt4 book ai didi

haskell - Lazy.ByteString 和 Lazy.Char8.ByteString 之间的区别

转载 作者:行者123 更新时间:2023-12-02 14:16:05 27 4
gpt4 key购买 nike

我对 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

最佳答案

这很有趣,我已经使用了所有 ByteString,但从未注意到(直到您提到)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.(Lazy.)?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

关于haskell - Lazy.ByteString 和 Lazy.Char8.ByteString 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com