'a->'b 유형의 ML 함수


19

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

'a -> 'b

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

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

let f x = raise Exit

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

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


2
CS101 학생 학습 프로그래밍을 답안에서 목표로 삼으십시오. 대답은 나중에 대답하도록 영감을 줄 수있는 유형 이론가가 아닙니다.
Gilles 'SO- 악한 중지'

어떻게 raise작동 하는지 알아 낸 방법을 설명하면 도움이 될 것입니다. 따라서 귀하의 교수가 찾고있는 솔루션 (작동하는 것과 동일한 이유로 raise작동하는 이유)이 작동 하는 이유를 가장 잘 설명하는 방법을 알고 있습니다.
sepp2k

@ sepp2k raise : exn -> 'a그래서 반환 값을 얻을 수 있으므로 인수를 무시합니다.
Gilles 'SO- 악마 중지


답변:


18

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

let rec f x = f x

19

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

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

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

let rec f x = f x

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

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


질문자는 첫 두 문단의 단어를 이해하지 못했지만 나는“그들의 결과는 결코 만들어지지 않을 것이므로 임의의 반환 유형이 주어질 수있다”는 문장을 좋아합니다.
Gilles 'SO- 악마 그만해'

1

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

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

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

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

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