我正在实现一项功能如下: 用户将通过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的新手。我理解为什么我会收到错误。
但我无法修复它。
请帮忙。
在此先感谢。
答案 0 :(得分:2)
我认为问题在于getListOfFiles
会返回IO
类型的值,并且通过将其与fmap
一起使用,您将创建一个Handler (IO _)
,并在do
阻止仅展开Handler
级别。
您可以尝试join
fmap
结果的两个级别,例如:
files <- join $ fmap (liftIO. ...
或者将getListOfFiles
调用移到fmap
应用程序之外,例如:
files <- liftIO . getListOfFiles =<< (fmap ...)