Haskell ByteString / Data.Binary.Get问题

时间:2010-03-09 23:12:47

标签: haskell bytestring

尝试使用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之间的互动,以及我如何做我想要的事情。感谢。

2 个答案:

答案 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)

所有人都应该与世界保持一致。