F #에 rec 키워드가 필요한 이유는 무엇입니까?


28

F #에서는 rec키워드 를 사용해야합니다 . Haskell에서는 주어진 함수가 재귀인지 아닌지를 명시 적으로 말할 필요가 없습니다.

함수형 프로그래밍에서 재귀의 역할을 감안할 때 F # 디자인은 다소 이상하게 보입니다. 좋은 언어 디자인 결정입니까, 아니면 역사적 이유로 또는 구현 제한 때문에 존재합니까?

답변:


16

Haskell과 F # 시맨틱에는 고유 한 차이가 있습니다. Haskell에서 함수 호출은 실제 계산을 수행하지 않지만 'thunk'라고하는 힙 객체를 할당합니다. 썽크가 자신 또는 다른 썽크에 링크를 갖는 것은 완벽하게 괜찮습니다. 그러나 F #에서 함수 호출은 실제 호출이므로 생성되기 전에 생성 let x = 1 : 2 : x in x해야하므로 유효하지 않은 식을 만듭니다 . 그러나 그것은 무한리스트에 대한 다소 합리적인 정의이며, 그것을 정의하는 어떤 방법이 존재해야합니다. 여기에 대한 뿌리가 있습니다. 더 많은 것을 원한다면 SML과 Haskell의 작동 의미론을 검색하고 읽으십시오.x1 : 2 : xrec


2
AFAIK, Haskell은 의도적으로 작동 의미가 없습니다.
dan_waterworth

@dan_waterworth 작동 의미론이 정의되지 않으면 컴파일 할 수 없습니다.
permeakra

8
언어 Haskell은 작동 의미론을 정의하지 않고 대신 의미 론적 의미를 제공합니다. 컴파일러를 구성 할 때 작동 의미론이 암시 적으로 정의되지만 이것이 하스켈 언어 표준의 일부라는 의미는 아닙니다.
dan_waterworth

6
@dan_waterworth 실제로 Haskell 언어의 구현 및 표준은 ghc 뿐이며 F # 표준은 Microsoft의 구현입니다. 이론적으로는 당신이 옳을 수도 있지만 연습은 완전히 다른 짐승입니다.
permeakra

19

질문은 SO에 대해 답변되었으며 , "rec"가 사용 된 이유에 대한 강력한 역사적 배경이 포함되어 있습니다.

후손에 대한 중요한 인용문은 다음과 같습니다.

프랑스어 CAML 언어 언어 (OCaml 포함)에서는 기본적으로 함수가 재귀 적이 지 않습니다. 이 선택을 사용하면 새 정의 본문 내에서 이전 정의를 참조 할 수 있으므로 해당 언어로 let을 사용하여 함수 (및 변수) 정의를 쉽게 대체 할 수 있습니다. F #은이 구문을 OCaml에서 상속했습니다.


12

재귀 let는 일반적인 것보다 훨씬 더 복잡한 의미를 정의합니다. 따라서, 단순하고 깨끗한 언어 디자인의 이익을 위해, 별도의 필요로 그냥 같은 모두가 좋은 이유가 let, let*그리고 letrec제도에가.

단순은와 let x = y in z같습니다 ((fun x -> z) y). 재귀 let은 훨씬 더 복잡하며 고정 소수점 결합기를 사용하는 것이 포함될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.