9

OCaml에서 함수를 정의하기 전에 함수를 선언 할 방법이 있습니까? OCaml 인터프리터를 사용하고 있습니다. 그것이 만들어되기 전에 myFunctionA이 myFunctionB를 호출 할 수 없기 때문에OCaml : 정의하기 전에 함수 선언하기

let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 

이것은,하지만 작동하지 않습니다

나는 두 가지 기능을 가지고있다.

몇 가지 Google 검색을 수행했지만 아무것도 찾을 수 없습니다. 이것을 어떻게 할 수 있습니까?

+0

관련 키워드 : "ocaml corecursive function". [OCaml에 대한 참고 사항 : 상호 재귀 함수] (http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html#Mutually%20recursive%20functions)를 참조하십시오. –

+1

나는 상호 회귀를 함축하는 동시 재귀를 들어 본 적이 없다고 말할 수는 없지만, 그것이 무엇을 의미하는지는 꽤 분명하다. – nlucaroni

답변

21

원하는 것은이 두 함수를 상호 재귀 적으로 만드는 것입니다. "let ... let ..."을 사용하는 대신 다음과 같이 "rec rec ... and ..."을 사용해야합니다.

let rec myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 
2

실제로 "let rec .."는 매우 심각합니다. 제한 : 단일 모듈 내에서만 작동합니다. 이것은 프로그래머가 원치 않는 곳에 큰 모듈을 작성하도록 강요합니다. C에서 발생하지 않는 문제!

모두 해결 방법이 있습니다. 모두 만족스럽지 않습니다. 첫 번째는 함수 유형의 변수를 만들고 처음에는 예외를 발생시키는 함수를 저장 한 다음 나중에 원하는 값을 저장하는 것입니다.

둘째는 클래스 유형 및 클래스 (및 간접 참조)를 사용하는 것입니다. 서로 재귀 적으로 많은 함수가있는 경우 (각 객체에 단일 객체 만 전달해야하기 때문에) 가장 좋은 방법입니다.

가장 쉽고 가장 못생긴 것은 함수를 인자로 전달하는 것입니다.이 솔루션은 빠르게 제어 할 수없는 솔루션입니다. 모든 정의를 따르는 모듈에서 "let rec"래퍼 집합을 도입하여 호출 코드를 단순화 할 수 있습니다. 불행히도 이것은 함수 정의에 도움이되지 않으며 대부분의 호출은 이러한 정의에서 발생합니다.

+0

재귀 모듈에 의해 다소 완화되었다는 것을 알 수 있습니다 (예 : http://stackoverflow.com/a/33482273/2482998). 그러나 여전히 꽤 어색합니다. – antron

관련 문제