I've decided to check out FParsec, and tried to write a parser for λ expressions. As it turns out, eagerness makes recursive parsing difficult. How can I solve this?
Code:
open FParsec
type λExpr =
    | Variable of char
    | Application of λExpr * λExpr
    | Lambda of char * λExpr
let rec FV = function
    | Variable v -> Set.singleton v
    | Application (f, x) -> FV f + FV x
    | Lambda (x, m) -> FV m - Set.singleton x
let Λ0 = FV >> (=) Set.empty
let apply f p =
    parse
        { let! v = p
          return f v }
let λ e =
    let expr, exprR = createParserForwardedToRef()
    let var = lower |> apply Variable
    let app = tuple2 expr expr
                 |> apply Application
    let lam = pipe2 (pchar 'λ' >>. many lower)
                        (pchar '.' >>. expr) (fun vs e ->
                                                List.foldBack (fun c e -> Lambda (c, e)) vs e)
    exprR := choice [
                    lam
                    app
                    var
                    (pchar '(' >>. expr .>> pchar ')')
                    ]
    run expr e
Thanks!