長さがエンコードされたバイナリ ストリームを解析しており、このコードをコンパイルしようとしています。コンビナトレントコード ( https://github.com/jlouis/combinatorrent/blob/master/src/Protocol/Wire.hs ) は非常に役に立ちましたが、今は行き詰まっています。return ステートメントで frame_length を使用するにはどうすればよいですか?
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) を使用するにはどうすればよいですか?