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

时间:2010-09-21 16:51:24

标签: haskell exception-handling recursion

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

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

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

2 个答案:

答案 0 :(得分:9)

Haskell为此提供MaybeEither类型。由于您想要返回错误状态,Either似乎就是您想要的。

答案 1 :(得分:5)

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