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