我试图通过在来自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的返回值的一部分。欢迎任何关于风格/惯例的评论
答案 0 :(得分:1)
您正在使用hGetContents
中的System.IO
,该IO String
会返回B.hGetContents
。您可能希望使用Data.ByteString
中的IO ByteString
,其返回IO B.ByteString
。
我之所以知道这一点,是因为错误消息表明它需要IO String
,但它有hGetContents
,“在{{1}}调用的返回类型中。”