2014-10-18 2 views
3

OCaml의 펑터 복용 다형 변형 유형

module F (M : sig 
    type t = [> `Foo ] 
end) = struct 
    type t = [ M.t | `Bar ] 
end 

내가 뭘 잘못 나에게

Error: A type variable is unbound in this type declaration. 
In type [> `Foo ] as 'a the variable 'a is unbound 

를 얻을 컴파일하려고? [> `Foo]은 공개 유형이고 암시 적으로 유형 변수를 포함하므로

답변

4

type t = [> `Foo]은 유효하지 않습니다.

type t = [ `Foo ] 

을하거나 정량화 :

type t = 'a list 

당신은 그것을 폐쇄 확인해야합니다 : 정의는 RHS는 LHS에서 정량화되지 않은 형식 변수가 있기 때문에 다음과 같은 유형 정의가 거부되는 것처럼 거부 입력 변수 :

type 'a t = [> `Foo] as 'a 

type 'a t = 'a constraint 'a = [> `Foo] 
012 동등
+0

필자의 functor 인수'M'가 서명에 지정되지 않은 추가 변형을 사용하여'F.t'를 확장 할 수 있기를 바랍니다. 예 : 'type t = [\'Foo | \'Baz]'. 그래서 폐쇄 형이 효과가 있다고 생각하지 않습니다. 내가 할 수있는 일이 가능한거야? 또한 공개 된 유형에 유형 변수가 포함 된 이유에 대해 명확하지 않습니다. 설명 할 수 있습니까? 설명에 연결할 수 있습니까? RWO는 암시 적 타입 변수에 대해서는 언급하지 않습니다. – int3

+0

''유형 t = [>'Baz | Mt]''는 당신이 원하는 것입니다; 여기서'Mt'는 닫을 수 있습니다. – camlspotter

+0

"암시 적 타입 변수"는 공식 OCaml 단어가 아닙니다. OCaml에서 인스턴스화 할 수있는 모든 것은 유형 변수를 가져야합니다. 예를 들어 열린 다 변수 형''[>'A | 'B '''그리고 열린 객체 타입''. 그러나 다른 곳에서 사용하지 않는다면 그것들을 생략 할 수 있습니다. 실제로 제약 조건을 가진 타입 변수를 작성하는 짧은 방법입니다 :'' 'a constraint'a = [>'A | 'B '''와''a = '과 같은 제약 조건을 사용합니다. 그것들은 제약 조건의 하위 유형에만 인스턴스화 할 수 있습니다. (''[>'A |'B]를 'a'로, ''을 'a'로 쓰면됩니다.) – camlspotter