문제

나는 서로에게 전화 할 두 가지 방법을 얻는 방법에 대해 약간 혼란스러워합니다 (즉, A() 전화 B() 그리고 B() 전화 A()). F#만이 코드에서 발생한 후 방법을 '보는 것'인 것 같습니다. 그렇지 않은 경우 값 또는 생성자는 정의되지 않았습니다.

여기서 매우 기본적인 것을 놓치고 있습니까?

도움이 되었습니까?

해결책

'rec ... 그리고 ...'는 당신이 찾는 구문입니다.

let rec F() = 
    G()
and G() =
    F()

또한보십시오 F# 공동 추방의 모험.

다른 팁

문제는 방법에 관한 것이고 Brian의 답변은 함수에 관한 것이므로 유형에 대해 유사한 구문을 사용할 수 있음을 지적하는 것이 유용 할 수 있습니다.

type A() =
    let b = new B()
    member x.MethodA() = b.MethodB()
and B() =
    member x.MethodB() = ()

또한 회원은 기본적으로 'ret rec'입니다 (실제로는 재귀 할 수 없다고 생각합니다).

F# 4.1 소개 상호 재귀 모듈 및 네임 스페이스.

이것들은 and 예어.

module rec PingPong = // <------ rec keyword here.

    let pong() = 
        printfn "pong"
        ping() 

    let ping () = 
        printfn "ping"
        pong()

그만큼 rec 키워드는 "모든 포함 된 코드가 상호 재귀를 허용하는 모듈 및 네임 스페이스를 정의합니다.

let를 통해 선언 된 기능

let rec a () = b ()
and b () = ()

이것들은 상호 재귀 기능.

동일한 유형 내의 메소드

type T () =
    member t.A () = t.B()
    member t.B () = ()

이것은 사소한 일입니다. 그것은 단지 작동합니다. 그래도 Abel의 의견에 주목하십시오.

다른 유형 내의 방법

type TypeA () =
    member t.A (b : TypeB) = b.B()

and TypeB () =
    member b.B () = ()

이것은 사용합니다 type ... and 구문 상호 재귀 유형.

메모

보통, and 통화가 양방향으로 발생하는 경우에만 사용됩니다. 그렇지 않으면 호출 된 함수가 먼저 오도록 선언을 다시 주문하는 것이 좋습니다. 원형 의존성을 피하고 사용되지 않는 곳을 암시하지 않도록 유형과 의존과 가독성에 도움이됩니다.

나는 일반적으로 기능을 요청하거나 다른 유형을 요청하기 위해 질문을 편집 할 것을 제안합니다 (이 경우이 답변에서 처음 두 경우를 제거합니다). 방법은 일반적으로 기능의 하위 집합으로 간주되며, 이는 일반적인 수학 용어입니다. 그러나 모든 F# 함수는 기술적으로입니다 CLI 방법, 그것이 그들이 편집 한 것입니다. 그대로, 질문이 무엇을 요구하는지는 명확하지 않지만, 제목이 암시하는 것처럼 수용된 대답에서 방법을 요구할뿐만 아니라 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top