避免一般使用返回两个函数的函数的值限制错误

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.

我通常如何处理这种情况?

pad*_*pad 5

棘手的一点是通用的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#值限制的部分,它也可能有用.