2012-12-04 2 views
1

recursive을 원할 때 let rec이 사용되는 것을 알고 있습니다.언제 let rec를 사용합니까?

let rec power i x = if i = 0 then 1.0 else x *. (power (i-1) x);;

좋아 예를 들어

, 나는 이해한다.


하지만 어떻게 하나 이것에 대해 :

let x y = y + y in x 2?

안에 rec을 사용해야합니까?

내면에는 x 2가 있기 때문에 스스로해야한다고 생각 합니다만, 컴파일러에서는 괜찮은 것 같습니다.

let rec을 사용해야 할 때 사용하면 안되나요?


또한,

let (-) x y = y - x in 1-2-3;;

let rec (-) x y = y - x in 1-2-3;;

의 차이점은 그들은 모두 법적 무엇입니까?

답변

7

먼저 OCaml의 범위 지정 규칙을 이해해야합니다.

let f XXX = YYY in ZZZ을 쓸 때 에 f을 사용하면 rec이 필요합니다. 두 경우 모두 (예 : rec 포함 또는 포함하지 않음) fZZZ에 정의됩니다.

그래서 :

let x y = y + y in 
x 2 

완벽하게 유효합니다.

두 번째 질문에 : 아니요, 최상위에서 시도하면 두 번째 문 반복문은 let rec loop x y = loop y x in()과 같습니다. 왜 계속 루핑되는지 이해하려면 loop의 응용 프로그램을 식별자가 본문으로 대체 된 확장으로 이해할 수 있습니다. 그래서 :

그래서 loop 몸이 function x y -> (function a b -> loop b a) y x로 확장 할 수 있습니다 function x y -> loop y x, 당신이 등등 등등 몸과를 적용 할 때 function x y -> loop x y에 해당, (나는 모호성을 피하기 위해 매개 변수 이름을 개명했다). 따라서이 함수는 결코 아무것도하지 않으며, 몸체를 확장/적용하고 인수를 바꿔 가며 영원히 반복합니다.

+0

왜 let rec (-) x y = y - x를 1-2-3 ;; '반복적으로 반복 할 수 있습니까? –

+0

@ JacksonTale : 함수'-'를 정의하고 함수 본문'x-y'에서 사용하고 있습니다. 그래서,'x-y'는 (일종의)'x-y'로 다시 확장되고 다시 ... –

+0

@AsiriRathnayake ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** xy ** ** ** yx ** 끊임없는? –