F#递归成员函数:“如何正确定义它”

时间:2017-01-20 13:01:54

标签: recursion f# member-functions

我理解当你在一个类型中定义一个递归成员函数时,就没有必要将函数定义为递归。含义使用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'未使用。递归对象引用的存在将运行时初始化检查添加到此类和派生类型中的成员。请考虑删除此递归对象引用。

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

2 个答案:

答案 0 :(得分:11)

是的,它们在被定义为成员时起作用。 正如您已经注意到的那样,您在通话网站上错过了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

答案 1 :(得分:3)

您可以在类的主体内定义正常的递归函数(它将是私有函数),然后将其作为成员公开,例如:

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