我正在尝试通过编写小程序来学习Haskell ...所以我正在为简单表达式编写词法分析器/解析器。 (是的,我可以使用Alex / Happy ......但我想先学习核心语言。)
我的解析器本质上是一组构建树的递归函数。在语法错误的情况下,我通常会抛出一个异常(即如果我是用C#编写的),但在Haskell中似乎不鼓励这样做。
那么替代方案是什么?我真的不想在解析器的每一位中测试错误状态。我希望最终得到一个有效的节点树,或者带有详细信息的错误状态。
答案 0 :(得分:9)
Haskell为此提供Maybe
和Either
类型。由于您想要返回错误状态,Either
似乎就是您想要的。
答案 1 :(得分:5)
对于可能失败的计算,其中包含有关其失效原因的详细信息,其类型为Either a b
,例如Either ErrorDetails ParseTree
,因此您的结果可能是Right theParseTree
或Left ErrorDetails
。您可以在递归函数中对这些构造函数进行模式匹配,如果出现错误,则将其传递给它;否则你会像往常一样继续。