当前位置:  开发笔记 > 编程语言 > 正文

在深度Haskell递归中,异常的替代方法是什么?

如何解决《在深度Haskell递归中,异常的替代方法是什么?》经验,为你挑选了2个好方法。

我正在尝试通过编写小程序来学习Haskell ...所以我正在为简单的表达式编写词法分析器/解析器.(是的,我可以使用Alex/Happy ......但我想先学习核心语言).

我的解析器本质上是一组构建树的递归函数.在语法错误的情况下,我通常会抛出一个异常(即如果我是用C#编写的),但在Haskell中似乎不鼓励这样做.

那么替代方案是什么?我真的不想在解析器的每一位中测试错误状态.我希望最终得到一个有效的节点树,或者带有详细信息的错误状态.



1> Paul..:

Haskell 为此提供了类型MaybeEither类型.既然你想要返回错误状态,Either似乎就是你想要的.



2> 小智..:

对于可能会失败的计算失败的详细信息,有类型Either a b,例如Either ErrorDetails ParseTree,所以你的结果可能是Right theParseTreeLeft ErrorDetails.您可以在递归函数中对这些构造函数进行模式匹配,如果出现错误,则将其传递给它; 否则你像往常一样继续.


编写错误线程的显式版本是了解monad为何如此有用的最佳方法之一.
较大的Haskell程序通过将实例Monad(Either ErrorDetails)放在......中来隐藏这些细节,因此您不必在每个函数中显式处理错误情况.
BTW,`Control.Monad.Error`为`Either String a`提供了一个monad实例,其中`fail"foo"== Left"foo"`和`return foo == Right foo`.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有