【问题标题】:Haskell Type errorHaskell 类型错误
【发布时间】:2011-02-08 16:16:30
【问题描述】:

我在此代码中收到无法匹配预期类型错误,我不确定原因。如果有人能指出我修复它的正确方向,将不胜感激。

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 ()' 匹配

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    基本的东西,你缺少括号:

    print (getBinary contents)
    

    但除此之外,您还需要使用 runGet 或类似的东西来运行 Get monad(解析器)中的代码。尝试在#haskell IRC 频道中寻求更详细的培训和支持。

    【讨论】:

    • 是的,我已经尝试将最后一行作为 print (runGet getBinary 内容),但随后出现错误 Couldn't match expected type bytestring-0.9.1.4:Data.ByteString.Lazy.Intern al.ByteString' against inferred type S.ByteString' 这似乎更糟...
    【解决方案2】:

    1) 你应该把它标记为家庭作业,即使问题很小(恕我直言)

    2) 打印(runGet getBinary 内容),如 dons 所说。

    3) getWord16be 不带参数。

    如果您打算读取文件“Test.class”,那么:

    contents <- S.readFile "Test.Class" 
    

    或者如果您确实想要标准输入,那么只需删除 Test.class:

    a <- getWord16be -- note there is no argument
    

    我猜你已经知道了,但是通常使用 Get 例程来获取许多数据字段并将它们打包到 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)
    

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2013-12-18
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多