由IO引起的错误是一种参数

时间:2017-01-16 13:00:14

标签: json haskell yesod

我正在实现一项功能如下: 用户将通过HTTP请求请求目录内容。目录路径将在请求中传递。作为回应,我将发送一个包含该目录路径的文件列表的JSON。 IO错误处理得到了解决。 我实施了大部分内容。但是我收到了一个错误。错误是:

Couldn't match expected type ‘Either IOException [FilePath]’
            with actual type ‘IO (Either IOException [FilePath])’
• In the first argument of ‘getJsonRepForFiles’, namely ‘files’

代码段如下:

getInfoOfDirR::Handler Value
getInfoOfDirR = do
             -- files will have type IO (Either IOException [FilePath])
                     files <- fmap (getListOfFiles.(Data.Text.unpack).fromJust) $ lookupGetParam "dirpath"
                     getJsonRepForFiles files

获取文件列表的函数:

-- This eliminates the hidden files from the results
getListOfFiles::FilePath -> IO (Either IOException [FilePath])
getListOfFiles fpath = try (fmap (filter $ not.isHiddenFile) $  FS.getDirectoryContents fpath)::IO (Either IOException [FilePath])

获取目录中文件的JSON表示的函数:

getJsonRepForFiles::Monad m => (Either IOException [FilePath]) -> m Value
getJsonRepForFiles (Left e) = returnJson $ "An error occurred" ++ show e
getJsonRepForFiles (Right files) = returnJson files

请注意,getInfoOfDirR的类型为Handler Value 我在Haskell的Yesod框架中实现了这一点。 我是Haskell的新手。我理解为什么我会收到错误。 但我无法修复它。 请帮忙。 在此先感谢。

1 个答案:

答案 0 :(得分:2)

我认为问题在于getListOfFiles会返回IO类型的值,并且通过将其与fmap一起使用,您将创建一个Handler (IO _),并在do阻止仅展开Handler级别。

您可以尝试join fmap结果的两个级别,例如:

files <- join $ fmap (liftIO. ...

或者将getListOfFiles调用移到fmap应用程序之外,例如:

files <- liftIO . getListOfFiles =<< (fmap ...)