2013-06-23 3 views
1

몇 가지 예를 읽고이 코드와 Google이 나를 실망 시켰습니다.OCaml 복잡한 이름 재사용 v 재귀 함수. 혼동

let id = fun x -> x in fun x -> if x> 0 then id [] else (id x) :: [];; 
- : int -> int list = <fun> 

는 일반적으로 함수로 증언의 Caml이 우리에게로이된다.

그러나 "let rec"대신 "let"이 있고 함수 이름 id는 여러 번 함수 본문에 나타납니다.

언뜻보기에는 비현실적입니다.

그래서

1. is this actually a recursive function? 

2. Or they just happen to be different types reusing the same name confusingly. 

당신이 명확한 추론 콘크리트 기초에 서있는 당신의 통찰력있는 아이디어를 보여줄 수 생각?

+0

또한 id 함수는이 질문의 대답에 의해 설명 된대로 익명의 함수이므로이 다음에 오는 어떤 문에서도 실제로 도달 할 수 없습니다. – didierc

+0

I 모든 것을 "이드"라고 생각하고있었습니다. – marsrover

+0

네, 그게 당신의 질문에서받은 인상입니다. 표기법은 다른 언어 관용구에 익숙한 사람들에게는 오도 될 수 있습니다. 'in' 키워드는 매우 중요하며, 내부 기능뿐만 아니라 최상위 레벨에서도 사용할 수 있습니다 (코드는 해당 기능을 명확하게 보여줍니다). 언어 "행위"를 최종 사용자에게 일관되게 만드는 것이 필요하며 문법을 단순화하기 때문에 언어 구현 자에게도 바람직합니다. 좋은 질문 btw. – didierc

답변

5

코드에는 두 가지 기능이 있습니다. 첫 번째는 fun x -> x입니다. 이 함수는 재귀가 아닙니다 (자체를 포함하여 다른 함수를 호출하지 않고 x을 변경하지 않고 반환 함) id의 이름은 let입니다.

다른 기능은 fun x -> if x > 0 then id [] else (id x) :: []입니다. 이 함수에는 이름이 없습니다. 또한 호출하는 유일한 함수가 id이고 id이기 때문에 재귀 적으로 호출되지 않습니다.

id은이 코드에서 재사용하지 않습니다. 이 함수는 fun x -> x 함수를 나타낼 때만 사용됩니다. 재사용되는 유일한 이름은 x입니다. id의 정의에서 이는 id의 인수를 나타내는 데 사용되며 다른 함수의 정의에서 해당 함수의 인수를 나타 내기 위해 사용됩니다.