2017-10-24 3 views
1

루트에 다형성 유형의 변수를 시행하면이 external 함께 :문제의 외부

let debug = make "name:space:a" 

let _ = debug "log this thing" 
let _ = debug 42 

불행하게도이 결과 : 나는 유형의 종류 사용할 필요가

external make : string -> 'a -> unit = "debug" 

마지막 줄의 다음 오류 :

This expression has type int but an expression was expected of type string

그래서 형식 매개 변수 ex 명시 적으로 다형성을 가지지 만, 내가 이해할 수있는 것으로부터 이것은 어떤 이유에서인지 바인딩에 첨부 된 타입 주석에서만 이루어질 수 있습니다. 외부에 추가하면 구문 오류가 발생합니다. 그래서 시도 :

This definition has type 'a -> unit which is less general than 'a0. 'a0 -> unit

그래서 나는 시스템을 부정하는 또 다른 방법을 시도하고 external 후이 권리를 추가합니다 : 오류에 물론 결과의

let debug : 'a. 'a -> unit = make "name:space:a" 

하는

let make : 'a. string -> 'a -> unit = make 

놀랍게도이 줄에 비슷한 유형의 오류를주지는 않지만 형식 주석을 무시하는 것처럼 보이고 let debug ...에 동일한 오류를 계속 표시합니다.

이 나를 매우 혼란 잎, 다음과 같은 질문 :

  1. 그것이 정말 가능하지 않다 다형성 유형의 외부를 정의하기 위해?
  2. 1에 대한 대답에 관계없이 외부와 명시적인 다형성 주석을 사용할 수없는 이유는 무엇입니까?
  3. let make ...의 형식 주석이 완전히 무시되는 이유는 무엇입니까?

참고 : 4.02.3에있는 BuckleScript를 사용하고 있습니다. 온라인 놀이터 here.

답변

4

이것은 값 제한으로 external을 사용한 결과가 아닙니다. (이전 토론, 많은 중 하나 : The value restriction)

debug의 정의는 함수 응용 프로그램이므로 일반화 (다형성 작성) 할 수 없습니다.

let debug x = make "name:space:a" x 

지금 debug의 당신의 정의가 일반화 될 수 람다입니다 :

이 솔루션은 ETA 확장을하는 것입니다.

(ETA 확장 이전 토론 : Why does OCaml sometimes require eta expansion?)

+0

흠, 난 내가 * * 명시 적 다형성 수 있도록 허용 된 경우 값 제한이 적용됩니다 방법을 이해 모르겠어요. 이 함수는 단위를 반환하기 때문에 어떤 유형의 불투명 한 값을위한 블랙홀일까요? 또한 η 확장은 유형 관점에서이 문제를 해결할 수 있지만 일부 응용 프로그램을 활성화하는 것 이외의 다른 이유로 함수가 다른 함수를 반환하도록하는 목적을 무력화시킵니다. – glennsl

+1

주석을 사용하여 일반적으로 가치가없는 값 제한을 피할 수는 없습니다. 그러나 값 제한은 정확하지 않으며 너무 제한적입니다. 일반화가 금지 된 무해한 경우를 쉽게 찾을 수 있습니다. –