由于 IO 类型的参数而出错

Getting error due to IO a type of parameter

我正在实现如下功能: 用户将通过 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 的新手。我有点理解为什么会收到错误消息。 但我无法修复它。 请帮忙。 提前致谢。

我认为问题在于 getListOfFiles returns 类型 IO 的值,通过将它与 fmap 一起使用,您正在创建一个 Handler (IO _) ,并且 do 块中的绑定仅展开 Handler 级别。

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

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

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

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