서로에게 전화하는 두 가지 방법은 무엇입니까?
-
22-08-2019 - |
문제
나는 서로에게 전화 할 두 가지 방법을 얻는 방법에 대해 약간 혼란스러워합니다 (즉, A()
전화 B()
그리고 B()
전화 A()
). 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 방법, 그것이 그들이 편집 한 것입니다. 그대로, 질문이 무엇을 요구하는지는 명확하지 않지만, 제목이 암시하는 것처럼 수용된 대답에서 방법을 요구할뿐만 아니라 생각합니다.