2011-10-26 108 views
1

我想用Data.Binary.Get monad解析Haskell中的簡單二進制文件。在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. 

有人能看到什麼,我做錯了什麼?

謝謝!

回答

3

的問題是你的最後一行,它解析爲:

(return msg) : parseMain 

但是,這真的不是唯一的問題。 parseMain是Get [MsgString]型的,當你確實需要一個[MsgString]所以你必須先運行一元行動:

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

聲明本會得到MsgString的無限列表,並沒有異常不會終止。也許你打算有一個if語句來防止遞歸調用parseMain

+0

謝謝!我現在看到我做錯了什麼。 :)關於程序的終止 - 我推遲了,直到我解決了這個問題。再次感謝你的幫助! – dirtdog