由于 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
级别。
您可以尝试 join
ing fmap
结果的两个级别,例如:
files <- join $ fmap (liftIO. ...
或者将 getListOfFiles
调用移到 fmap
应用程序之外,例如:
files <- liftIO . getListOfFiles =<< (fmap ...)
我正在实现如下功能: 用户将通过 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
级别。
您可以尝试 join
ing fmap
结果的两个级别,例如:
files <- join $ fmap (liftIO. ...
或者将 getListOfFiles
调用移到 fmap
应用程序之外,例如:
files <- liftIO . getListOfFiles =<< (fmap ...)