2010-04-16 112 views
1

我得到一個無法匹配此代碼的預期類型錯誤,我不知道爲什麼。如果有人能夠指出我正確的方向來解決問題,將不勝感激。Haskell類型錯誤

import qualified Data.ByteString.Lazy as S 
import Data.Binary.Get 
import Data.Word 

getBinary :: Get Word16 
getBinary = do 
    a <- getWord16be "Test.class" 
    return (a) 

main :: IO() 
main = do 
    contents <- S.getContents 
    print getBinary contents 

具體來說它不能匹配,期望型 'S.ByteString - > IO()' 來推斷型 'IO()'

回答

6

基本的東西,你錯過了括號:

print (getBinary contents) 

但是,除此之外,您需要使用runGet或類似的東西來運行Get monad(解析器)中的代碼。嘗試在#haskell IRC頻道中尋求更詳細的培訓和支持。

+0

是啊,我甲肝Ë試圖最後行 打印(runGet getBinary內容) 但隨後得到的錯誤 無法比擬預期型'字節字符串-0.9.1.4:Data.ByteString.Lazy.Intern al.ByteString」 針對推斷出的類型'S.ByteString' 這似乎更糟...... – Jon 2010-04-16 04:17:53

2

1)你應該將其標記爲功課,即使問題是小(恕我直言)

2)印刷(runGet getBinary內容),作爲行蹤詭祕說。

3)getWord16be不接受參數。

如果你打算讀取文件「的Test.class」,則:

contents <- S.readFile "Test.Class" 

,或者如果你真的想要的標準輸入然後就消除的Test.class:

a <- getWord16be -- note there is no argument 

我「M猜你已經知道了,但通常會得到例程用來獲取許多數據領域,並將它們打包到一個ADT:

data ExampleStruct = St { field1,field2 :: Word16 
         , field3 :: Word8 } deriving (Eq, Ord, Show) 

-- Extract ExampleStruct 
-- The data is formatted [Field1 | Field3 | Field2 ] on disk 
getBinary = do 
    f1 <- getWord16be 
    f3 <- getWord8 
    f2 <- getWord16be 
    return (St f1 f2 f3)