2010-03-09 5 views
3

Data.Binary.Get 및 ByteString를 사용하려고하고 무슨 일이 일어나고 있는지 이해하지. 내 코드는 다음과 같습니다 :하스켈 ByteString/Data.Binary.Get 질문

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 및 내가 의도 한 바를 어떻게 수행 할 수 있는지. 감사.

답변

1

두 개의 ByteString 데이터 형식이 있습니다. 하나는 Data.ByteString.Lazy이고 다른 하나는 Data.ByteString입니다.

ByteString을 정규화하는 L이 주어지면, 나는 게으른 다양성을 원하지만, getByteString은 엄격한 ByteString을 제공합니다.

게으른 ByteString들 내부적으로 엄격한 ByteString의 목록으로 표시됩니다.

다행히도 Data.ByteString.LazyByteString의 엄격한 목록을 게으른 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) 

에의 코드를 변경하고 모든 세계를 잘 작성해야한다.

+1

당신은 게으른 ByteString로 변환 할 필요가 없습니다. haddock 문서는 훌륭합니다. –

+0

그게 너무 작동합니다. =)이 경우 –

+0

사실이. 이것은 분명히 다른 작업 임에 유의할 가치가 있습니다. 이 바이트의 전체'seglen'을 강제로 필요하지 않을 때'getByteString'를 사용하면'동안 getLazyByteString' 게으른 유지됩니다. 최대 크기는 64KB의,하지만 그했다 경우는'getWord32be'은 다음 잠재적으로 32 기가 바이트 할당을 강제하는 대신 게으른 행동을 할 가능성이 줄 때 아마도 이것은 중요하지 않습니다. –

5

그것은 당신이 튜플의 두 번째 요소는 Data.ByteString에서 L.ByteString (나는 L은 Data.ByteString.Lazy에서 있다고 가정)하지만 getByteString 돌아 간다 엄격한 ByteString 될 것으로 기대했다. 당신은 아마 getLazyByteString를 사용하고 싶습니다. 단지 getLazyByteString``를 통해 직접 하나를 얻을 -