0

この実行時エラーの理由がわからない:

hdr or err: too few bytes
From:   demandInput

以下から:

module Main (main) where

import GHC.Word
import qualified Data.ByteString as BS
import Data.Serialize
import Data.Serialize.Get
import Data.Serialize.Put

data Header =
  Header { ty      :: Word8
         , len     :: Word16
         } deriving (Show)

instance Serialize Header where
  put (Header ty len) = do
    putWord8 ty
    putWord16be len
  get = do
    ty  <- getWord8    >>= return . fromIntegral
    len <- getWord16be >>= return . fromIntegral
    return (Header ty len)

main :: IO ()
main = do
  let bs = encode (Header 1 2)
  let str = case (runGet get bs) of
        Left err -> err
        Right fr -> fr
  putStrLn $ "hdr or err: " ++ str
4

1 に答える 1

3
let str = case (runGet get bs) of
        Left err -> err
        Right fr -> fr

frhereの推定型はです。これはStringの型でerrあり、case 式の選択肢は同じ型でなければなりません。したがって、Serializeインスタンスを使用しStringて結果をデコードしていますが、これは明らかに意図したものではありません。

これを修正するshowには、デコードされた結果を強制的に文字列にするのではなく、最初に追加して文字列に変換します。次に、型注釈を追加して、あいまいになった の型を解決しますfr

let str = case (runGet get bs) of
        Left err -> err
        Right fr -> show (fr :: Header)
于 2012-11-29T21:47:04.527 に答える