Rei*_*aka 2 f# type-inference fparsec
我想将FParsec createParserForwardedToRef函数与通用的Expr联合一起使用,如下所示:
type Expr<'Term> =
| Unary of Operator * Expr<'Term>
| Binary of Operator * Expr<'Term> * Expr<'Term>
| Ternary of Operator * Expr<'Term> * Expr<'Term> * Expr<'Term>
| Term of 'Term
let expr, exprR = createParserForwardedToRef<Expr<'T>,unit>()
Run Code Online (Sandbox Code Playgroud)
我无法摆脱价值限制错误.我不能变成exprCLR功能,更不用说了exprR.
我通常如何处理这种情况?
棘手的一点是通用的Expr<'T>.您可以创建一个返回expr解析器的函数,然后让解析器的后续使用确定特定类型Expr<'T>:
let expr() =
// initially exprRef holds a reference to a dummy parser
let expr, exprRef = createParserForwardedToRef()
// create other union-case parsers as inner or outer functions
let unary() = ...
let binary = ...
let ternary() = ...
let term() = ...
// replace dummy parser reference in exprRef
do exprRef := choice [unary(); binary(); ternary(); term()]
expr
Run Code Online (Sandbox Code Playgroud)
您还可以将原始解析器(term如参数)传递给expr函数.在这种情况下,类型expr取决于不同种类的如通过解析器pstring,pfloat.
FParsec教程有一个关于F#值限制的部分,它也可能有用.