2010-04-16 100 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)