‘a->’b 유형의 ML 함수 함수를 생각해 보라고했습니다. ‘a -> ‘b 즉,

교수님은 OCaml에서 다음과 같은 유형의 함수를 생각해 보라고했습니다.

'a -> 'b

즉, 하나의 인수가 무엇이든 될 수 있고 다른 것을 반환 할 수있는 함수입니다.

raise인수를 무시하는 함수를 사용하려고 생각 했습니다.

let f x = raise Exit

그러나 교수는 표준 라이브러리에서 어떤 기능을 요구하지 않는 솔루션이 있다고 말했다. 혼란 스럽습니다. 'b처음에없는 경우 어떻게 만들 수 있습니까?

무슨 일이 일어나고 있는지 이해하고 싶기 때문에 설명하지 않고 프로그램을보고 싶지 않기 때문에 Stack Overflow 대신 여기에 묻습니다.



답변

골격은 let f x = BODY입니다. BODY에서는 (예를 들어, 예상하는 정수하는 기능에 전송하지 않습니다)에만 일반적인 방법으로 X를 사용해야합니다, 당신은의 값을 반환해야 어떤 다른 유형입니다. 그러나 후자는 어떻게 사실 일 수 있습니까? “모든 유형의 'b경우, 리턴 값은 유형의 값 “이라는 명령문을 만족시키는 유일한 방법 'b은 함수가 리턴 하지 않도록하는 것 입니다. BODY 오류 또는 종료되지 않는 두 가지 가능성이 있습니다. 기능 raise오류, 다음은 끝나지 않습니다.

let rec f x = f x

답변

첫째, 몇 가지 언급. 핵심 유형의 람다 미적분학 만 사용 'a -> 'b하면 타이핑 시스템이 Curry Howard isomorphism을 통해 직관 논리 에 대응하기 때문에 얻을 수 A → B없으며 해당 공식 은 타우 톨 로지가 아닙니다.

튜플 및 일치 / 조건부와 같은 다른 확장은 여전히 *논리 연결 및에 해당하는 제품 유형 과 또는에| 해당하는 합계 유형 을 추가하여 일부 논리 일관성을 유지 합니다 . 다시 말하지만, 타우 톨 로지가 아닌 수식을 증명할 수 있기 때문에 해당 유형 을 생산할 것으로 기대하지 마십시오 .'a -> 'b

따라서 유일한 기회는 다음과 같은 논리에서 벗어날 수있는 다른 구조를 사용하는 것입니다 raise(그러나이 경우 허용되지 않습니다) … 또는 let rec! 재귀를 사용하면 종료되지 않는 프로그램을 만들 수 있으며 결과는 절대로 생성되지 않으므로 임의의 반환 유형이 주어질 수 있습니다. 이제 가장 사소한 비 종료 함수 (결과를 반환하기 위해 직접 호출하는 함수)에 대해 생각하면 :

let rec f x = f x

'a -> 'b제공된 유형이 정확히 무엇이든, 계산 된 값이 아닌 결과는 어떤 유형이든 가정 할 수 있습니다.

물론 이것은 f흥미로운 기능은 아니지만 요점입니다. OCaml에서 형식이 유효한 수식처럼 보이지 않는 함수는 의심스러운 함수입니다.


답변

컴파일러 프리미티브를 사용하면 다음과 같이 작성할 수 있습니다.

external magic: 'a -> 'b = "%identity"

(실제로 컴파일러 배포는 언어의 일부는 아니지만 이것을 제공합니다). 이것은 안전하지 않은 ID 캐스트입니다.

교수님은 거의 이것을 원하지 않습니다. 그러나 이것은 내가 알고 있는 유형 의 유일한 유용한 기능 'a -> 'b이며 실제로 OCaml 배포 자체에서 사용됩니다.