長さエンコードされたバイナリストリームを解析しています。このコードをコンパイルしようとしています。コンビナトレーションコード(https://github.com/jlouis/combinatorrent/blob/master/src/Protocol/Wire.hs)は私の動きを助けるのにとても役に立ちましたが、今は固まっています。 return文でframe_lengthを使用するにはどうすればよいですか?Attoparsecの条件付き解析とキャスト
data FrameCont = FINAL | MORE | BADCONT
deriving (Show, Eq)
frame_cont 0x00 = FINAL
frame_cont 0x01 = MORE
frame_cont otherwise = BADCONT
data FrameSize = Small Word8 | Jumbo B.ByteString
deriving (Show)
get_fc = do
raw_cont <- AP.anyWord8
guard((frame_cont raw_cont) /= BADCONT) AP.<?> "State must be either MORE or FINAL"
return raw_cont
parser = do
frame_length <- AP.anyWord8
case frame_length of
0x255 -> return (Jumbo <$> AP.take 8, get_fc, AP.take (fromIntegral frame_length))
otherwise -> return (Small otherwise, get_fc, AP.take (fromIntegral frame_length))
また、Word64にパス(AP.take 8)を使用するにはどうすればよいですか?
これ以上のコンテキストがなければ、私たちは推測できます。 'parser'にはどのような型がありますか?それは何をすべきか?私が最後の質問を正しく理解していれば、 'AP.take 8 'から8バイトのByteStringを' foldl'(\ wb - >(shiftL w 8))を介して 'Word64 'に変換することができます。 fromInternet b)0。解凍する。 –
私は先に進み、より多くの文脈を追加しました。私はWord8とByteStringの両方をカプセル化する型を持っています。私は将来、Word64にバイトコードを変更したいと思うでしょう。 – xrl