Первые компоненты двух ветвей синтаксического анализатора имеют разные типы, ветвь Jumbo
- это Parser FrameSize
, другая - простая FrameSize
. Если parser
должен иметь тип Parser (Parser FrameSize, Parser Word8, Parser ByteString)
, просто измените первый компонент второй ветви на return (Small otherwise)
. Однако более вероятно, что вы захотите parser :: Parser (FrameSize, Word8, ByteString)
, поэтому вам придется запускать другие парсеры внутри parser
. Я думаю
parser = do
frame_length <- AP.anyWord8
frame_size <- case frame_length of
0xFF -> Jumbo <$> AP.take 8 -- 0xFF == 255, 0x255 == 597
flen -> return (Small flen)
fc <- get_fc
bs <- AP.take (fromIntegral frame_length)
return (frame_size, fc, bs)
по крайней мере близко к тому, что вы хотите.
Примечание по стилю: вы смешиваете слова camelCase и underscore_separated, лучше соглашайтесь на одно (преобладающим стилем в Haskell является camelCase, поэтому я советую выбирать это).