2017-01-20 3 views
4

유형 내에서 재귀 멤버 함수를 정의 할 때 재귀 적으로 함수를 정의 할 필요가 없다는 것을 이해합니다. rec 키워드의 의미.F # 재귀 멤버 함수 : "올바르게 정의하는 방법"

그러나 나는이 작업을 수행 할 때

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

그럼 내가 재귀 정의되지 않는 오류가 발생합니다.

나는 this.recursion을 시도하지만 난 여전히 말하는 경고를 얻을 :

재귀 개체 참조 '이'사용되지 않습니다. 재귀 객체 참조가 있으면이 초기화 유형과 파생 된 유형의 구성원에게 런타임 초기화 검사가 추가됩니다. 이 재귀 적 객체 참조를 제거하는 것을 고려하십시오.

그래서 유형 내에서 재귀 멤버 함수를 정의하는 올바른 방법이 무엇일까 궁금합니다.

+0

경고는 일반적으로 _values_에 대해 발행되며 기능에는 제공되지 않습니다. 게시 한 정확한 코드로 경고 메시지가 표시됩니까? 아니면 우리에게 보여주지 않는 다른 코드였습니까? –

답변

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 
+0

고마워요. 앞으로 내 인생을 편하게 만들어 줄 것입니다! – Nulle

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 
+4

이것이 좋은 습관이라고 생각하지만''멤버 ''내부에''let rec''를 정의 할 것입니다. 내부 함수로 유형 수준 범위에있을 필요가 없습니다. – Gustavo

+0

이것은 실제로 질문에 대답하지 않습니다. –