2014-10-24 3 views
0

내가 가진 코드 : 그것을 위해두 함수를 호출하고 그 결과를 서로의 인수로 사용하는 방법은 무엇입니까?

let join a ~with':b ~by:key = 
    let rec a' = link a ~to':b' ~by:key 
     and b' = link b ~to':a' ~by:(Key.opposite key) in 
    a' 

및 컴파일 결과는 다음과 같습니다

Error: This kind of expression is not allowed as right-hand side of `let rec' build complete

나는 그것을 다시 작성할 수 있습니다 :

let join a ~with':b ~by:key = 
    let rec a'() = link a ~to':(b'()) ~by:key 
     and b'() = link b ~to':(a'()) ~by:(Key.opposite key) in 
    a'() 

그것은이 컴파일 가능한 변형,하지만 기능은 무한하다하여 구현 재귀 적이며 필요한 것이 아닙니다.

내 질문 : 첫 번째 구현이 유효하지 않은 이유는 무엇입니까? 두 함수를 호출하고 그 결과를 서로의 인수로 사용하는 방법?

제 컴파일러 버전

= 4.01.0

+1

이것은 식당 철학자의 문제 또는 교착 상태 문제와 비슷합니다. 해결책이있는 것도 상상할 수 없습니다. 나는 ocaml에 대해 아무것도 몰라, 단지 이것이 어떤 종류의 문제인지 지적하고 싶었다. – Luminous

답변

1

첫 번째 질문에 대한 대답은 Section 7.3 of the OCaml manual에 제시되어있다. 그 내용은 다음과 같습니다 :

Informally, the class of accepted definitions consists of those definitions where the defined names occur only inside function bodies or as argument to a data constructor.

귀하의 이름이 지원되지 않는 함수 인수로 나타납니다.

그 이유는 다른 의미를 지정할 수 없다고 생각됩니다. 당신이 보는 무한한 계산은 일반적으로 피할 수없는 것처럼 보입니다.

+0

내 두 번째 질문에 대한 답이라고 생각합니다. 직접적으로 : 두 개의 함수를 호출하고 그 결과를 서로의 인수로 사용하는 것은 불가능합니다. 왜냐하면 비공식적으로 허용되는 정의의 클래스는 정의 된 이름이 함수 본문 내부에서만 발생하거나 데이터 생성자 (함수가 아닌)의 인수로 나타나는 정의로 구성되기 때문입니다. –

+0

나는이 질문들이 닫혀 있다고 생각한다. –

관련 문제