在执行文件IO时,无法匹配预期类型

时间:2014-05-15 08:59:44

标签: haskell io

我试图通过在来自getDirectoryContents的列表中的每个元素上调用loadFile来编写一个将目录中的所有文件加载到[ByteString]中的函数

现在我得到了这个:

import Data.ByteString
import System.Directory
import System.IO
import Control.Monad

loadFile :: String -> IO B.ByteString
loadFile fileName = withFile fileName ReadMode (\handle -> hGetContents handle)

loadFiles :: String -> IO [IO B.ByteString]
loadFiles x = return (map (loadFile) $ getDirectoryContents x)

我收到了这个错误:

main.hs:28:60:
    Couldn't match type `[Char]' with `B.ByteString'
    Expected type: IO B.ByteString
      Actual type: IO String
    In the return type of a call of `hGetContents'
    In the expression: hGetContents handle
    In the third argument of `withFile', namely
      `(\ handle -> hGetContents handle)'

我是haskell的新手(我昨天开始学习)所以这个错误信息让我感到困惑。我希望它推断出类型B.ByteString,因为它是loadFile的返回值的一部分。欢迎任何关于风格/惯例的评论

1 个答案:

答案 0 :(得分:1)

您正在使用hGetContents中的System.IO,该IO String会返回B.hGetContents。您可能希望使用Data.ByteString中的IO ByteString,其返回IO B.ByteString

我之所以知道这一点,是因为错误消息表明它需要IO String,但它有hGetContents,“在{{1}}调用的返回类型中。”