F# 递归成员函数:"How to Define it correctly"

F# Recursive Member Function : "How to Define it correctly"

据我了解,当您在类型中定义递归成员函数时,无需将函数定义为递归。 rec 关键字的含义。

然而当我这样做时:

type hello() = class
  member this.recursion(x) =
      match x with
      |10 -> printfn "%A" x
      |_ -> printfn "%A" x
            recursion(x+1)
end

然后我收到未定义递归的错误。

我试过 this.recursion 但我仍然收到警告说:

递归对象引用 'this' 未使用。递归对象引用的存在向该类型和派生类型中的成员添加了运行时初始化检查。考虑删除此递归对象引用。

所以我想知道在类型中定义递归成员函数的正确方法是什么?

是的,它们在定义为成员时起作用。 正如您已经注意到的,您在呼叫站点缺少 this 。应该是:

this.recursion(x+1)

但这很有效,至少对我来说:

type hello() = class
  member this.recursion(x) =
      match x with
      |10 -> printfn "%A" x
      |_ -> printfn "%A" x
        this.recursion(x+1)
end

无论如何,我会在内部定义它,如其他答案所示,但在方法内部:

type hello() = class
  member this.recursion(x) =
    let rec loop x =
      match x with
      |10 -> printfn "%A" x
      |_ -> printfn "%A" x
            loop (x+1)
    loop x
end

您可以在 class 的主体中定义普通递归函数(它将是私有函数),然后将其公开为成员,例如:

type Hello() =

    let rec recursion x =
        match x with
        | 1 -> printfn "%A" x
        | _ -> printfn "%A" x; recursion (x+1)


    member this.Recursion(x) = recursion x