【发布时间】:2020-11-30 20:00:58
【问题描述】:
我想向用户展示一个“FParsec 解析器”-加上-“测试数据”列表,他们可以从中交互式地选择并查看解析器在提供的文本上运行的结果。
具体来说,我正在尝试将我的解析器测试收集到这种类型的记录列表中:
type FUNCTION_TEST =
| XELEMENT_MATCH of label : string * func : Parser<(int * string), unit> * data : string
| XKEYVALUE_MATCH of label : string * func : Parser<(string * string), unit> * data : string
let testable_parsers = [( "xElement", xElement, xElement_text3)
( "xKeyValue", xKeyValue, xKeyValue_text)]
xKeyValue 上面抛出错误...
val xKeyValue: Parser<(string * string), unit>
Full name CustomParser.xKeyValue
FS0001:the type '(int * string)' does not match the type 'string * string'
我希望用户看到并选择一个label 字符串并查看运行解析器的结果。
我了解解析器 xElement : Parser<int * string, unit> 与解析器 xKeyValue : Parser<(string * string), unit> 不匹配。这两种子类型都是 FUNCTION_TEST 可区分联合的一部分但是我不能将解析器放在同一个列表中,因为它们的子类型(XELEMENT_MATCH 与 XKEYVALUE_MATCH)不同意。
我想在有区别的联合上使用match ... with 来处理这个问题。
我是 F# 和 FParsec 的新手,没有优雅的想法。我必须用do! 和printfs 对菜单进行硬编码吗?
经验丰富的 F# 和 FParsec 开发人员如何允许用户从不同类型的选项菜单中进行选择?
【问题讨论】:
标签: f# discriminated-union fparsec