2011-10-26 12 views
1

Haskellで単純なバイナリファイルをData.Binary.Getモナドで解析しようとしています。HaskellでData.Binary.Getで単純なバイナリファイルを解析する

私のコードの簡易版は、次のようになります

data MsgString = Definition_msg { 
     msg_no  :: Word16 
    } deriving (Show) 

parseDef :: Get MsgString 
parseDef = do 
    msg_no <- getWord16le 
    return $ Definition_msg msg_no 

parseMain :: Get [MsgString] 
parseMain = do 
     bit <- getWord8 
     msg <- parseDef 
     return msg:parseMain 

そして、私が取得エラーは次のとおりです。

Prelude> :l example.hs 
[1 of 1] Compiling Main    (example.hs, interpreted) 

example.hs:23:17: 
    Couldn't match expected type `[m MsgString]' 
      against inferred type `Get [MsgString]' 
    In the second argument of `(:)', namely `parseMain' 
    In the expression: return msg : parseMain 
    In the expression: 
     do { bit <- getWord8; 
      msg <- parseDef; 
       return msg : parseMain } 
Failed, modules loaded: none. 

誰もが私が間違って何を見ることができますか?

ありがとうございます!

(return msg) : parseMain 

しかし、それは本当に唯一の問題ではありません。

答えて

3

問題がとして解析し、あなたの最後の行、です。

parseMain :: Get [MsgString] 
parseMain = do 
    bit <- getWord8 
    msg <- parseDef 
    rest <- parseMain 
    return (msg : rest) 

お知らせこれはMsgString年代の無限のリストを取得し、例外なく終了しません:あなたは本当にただ[MsgString]はそうあなたが最初のモナドアクションを実行する必要がありますしたいときparseMainはタイプGet [MsgString]です。おそらく、あなたはparseMainへのその再帰呼び出しを守るifステートメントを持つことを意図しましたか?

+0

ありがとうございます!私は今私が間違っていたものを見る。 :)プログラムの終了に関しては、私はこの問題を修正するまで延期しました。あなたの助けをもう一度ありがとう! – dirtdog

関連する問題