2

我想使用带有通用 Expr 联合的 FParsec createParserForwardedToRef 函数,如下所示:

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>()

我无法摆脱价值限制错误。我不能变成exprCLR 函数,更不用说exprR.

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

4

1 回答 1

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

您还可以将原始解析器(例如term参数)传递给expr函数。在这种情况下,类型expr取决于传递的不同类型的解析器,例如pstringpfloat

FParsec 教程有一个关于F# 值限制的部分,这也可能会有所帮助。

于 2012-12-11T10:55:34.207 回答