抛出错误的代码部分(ParseError`类型)与 捕获错误的代码(仅捕获ParseError`类型的异常)。 然而,这种耦合并没有反映出来 在类型上。 解析过程中产生的所有错误都必然是致命的。 也就是说,不可能生成警告,然后进行类型检查。
创建一个Parser monad(我们称之为ParserM,类型为ParserMa=ExceptT-ParserError(WriterT[ParserWarning]a) 注意变压器的顺序:我们希望恢复警告,即使我们也会收到错误。
编写一个函数liftParse::ParserM a->TCM a,该函数: 输出解析产生的警告(如果有)。 如果解析导致ParseError(即未返回“a”),则失败并返回错误。