Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 由于IO类型的参数而导致获取错误_Json_Haskell_Yesod - Fatal编程技术网

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])

我正在实现一个功能,如下所示: 用户将通过HTTP请求请求目录内容。目录路径将在请求中传递。作为响应,我将发送一个JSON,其中包含该目录路径的文件列表。IO错误处理已完成。 我已经实现了大部分部分。但是我犯了一个错误。错误是:

代码片段如下所示:

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
ing
fmap
结果的两个级别,如:

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 ...)