Json 由于IO类型的参数而导致获取错误
我正在实现一个功能,如下所示: 用户将通过HTTP请求请求目录内容。目录路径将在请求中传递。作为响应,我将发送一个JSON,其中包含该目录路径的文件列表。IO错误处理已完成。 我已经实现了大部分部分。但是我犯了一个错误。错误是: 代码片段如下所示:Json 由于IO类型的参数而导致获取错误,json,haskell,yesod,Json,Haskell,Yesod,我正在实现一个功能,如下所示: 用户将通过HTTP请求请求目录内容。目录路径将在请求中传递。作为响应,我将发送一个JSON,其中包含该目录路径的文件列表。IO错误处理已完成。 我已经实现了大部分部分。但是我犯了一个错误。错误是: 代码片段如下所示: getInfoOfDirR::Handler Value getInfoOfDirR = do -- files will have type IO (Either IOException [FilePath])
getInfoOfDirR::Handler Value
getInfoOfDirR = do
-- files will have type IO (Either IOException [FilePath])
files <- fmap (getListOfFiles.(Data.Text.unpack).fromJust) $ lookupGetParam "dirpath"
getJsonRepForFiles files
获取目录中文件的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值
我正在Haskell的Yesod框架中实现这一点。
我是哈斯克尔的新手。。我多少能理解为什么我会出错。
但我无法修复它。
请帮忙。
提前感谢。我认为问题在于
getListOfFiles
返回类型为IO
的值,通过将其与fmap
一起使用,您正在创建一个处理程序(IO)
,而do
块中的绑定仅打开处理程序
级别
您可以尝试join
ingfmap
结果的两个级别,如:
files <- join $ fmap (liftIO. ...
请注意,我曾尝试使用
liftIO
,但它也没有解决响应的问题。我尝试了两种方法。现在我得到了这个错误:无法将类型“IO”与“HandlerT HelloWorld IO”匹配预期类型:HandlerT HelloWorld IO(IOException[FilePath])实际类型:IO(IOException[FilePath])@ChetanYewale我想您需要文件非常感谢。成功了。我想问你一件事,我是哈斯克尔的新手。我理解函数式编程风格。我也了解函子和应用程序。我对单子有点不舒服。是否有任何实践问题,我可以做,这将逐步帮助我更好地在这些概念?让我知道。。我希望从使用应用程序/函子/单子的小问题开始。我还想更好地理解打字系统,避免我发布的那种问题。你有什么建议吗?@ChetanYewale对我最有效的方法实际上是实现几个Monad
typeclass的实例,以消除一些“魔力”。除此之外,做你看起来正在做的事情——在事情发生时进行处理(至少,除非我真的用它解决了一个问题,否则没有什么东西对我有吸引力)。@ChetanYewale你对使用say的一元属性感到满意吗,也许
或者或者
——一旦你到了某个状态,你就“不能”再往前走了?它归结为>=::ma->(a->mb)->mb
。给定ma
,您需要能够获得a
以传递到第二个参数以获得mb
,但是在可能是a
或的情况下,如果您有无
或左b
您没有a
来传递,因此您别无选择,只能停止。
getJsonRepForFiles::Monad m => (Either IOException [FilePath]) -> m Value
getJsonRepForFiles (Left e) = returnJson $ "An error occurred" ++ show e
getJsonRepForFiles (Right files) = returnJson files
files <- join $ fmap (liftIO. ...
files <- liftIO . getListOfFiles =<< (fmap ...)