尝试使用Data.Binary.Get和ByteString而不了解发生了什么。我的代码如下:
getSegmentParams :: Get (Int, L.ByteString)
getSegmentParams = do
seglen <- liftM fromIntegral getWord16be
params <- getByteString (seglen - 2)
return (seglen, params)
我对返回元组的第三项收到以下错误,即有效负载:
Couldn't match expected type `L.ByteString'
against inferred type `bytestring-0.9.1.4:Data.ByteString.Internal.ByteString'
有人请向我解释Data.Binary.Get和ByteStrings之间的互动,以及我如何做我想要的事情。感谢。
答案 0 :(得分:5)
它表示你希望元组的第二个元素是L.ByteString
(我假设L来自Data.ByteString.Lazy
)但是getByteString
例程从{{1}返回一个严格的ByteString }}。您可能想要使用Data.ByteString
。
答案 1 :(得分:1)
有两种ByteString
数据类型:一种位于Data.ByteString.Lazy
,另一种位于Data.ByteString
。
鉴于L
符合你的ByteString,我认为你想要懒惰的变种,但是getByteString
给你一个严格的ByteString
。
懒惰的ByteString
在内部由严格ByteString
的列表表示。
幸运的是,Data.ByteString.Lazy
为您提供了将严格ByteString
列表转换为惰性ByteString
的机制。
如果你定义
import qualified Data.ByteString as S
strictToLazy :: S.ByteString -> L.ByteString
strictToLazy = L.fromChunks . return
您可以将代码片段更改为
getSegmentParams :: Get (Int, L.ByteString)
getSegmentParams = do
seglen <- liftM fromIntegral getWord16be
params <- getByteString (seglen - 2)
return (seglen, strictToLazy params)
所有人都应该与世界保持一致。