2009-12-20 2 views
9

ocaml 언어 사양에는 짧은 섹션이 있습니다.ocaml은 무엇을 입력합니까? 'a ->'뜻?

poly-typexpr ::= typexpr 
       | { ' ident }+ . typexpr 

텍스트에는 설명이 없으며 poly-typexpr의 유일한 인스턴스는 메소드 유형을 정의하는 데 있습니다.

method-type ::= method-name : poly-typexpr 

나 할래?

답변

12

poly-typexpr 또한 레코드 필드의 유형으로 사용할 수 있습니다 (Section 6.8.1 참조). some debate on that point이 있지만 일반적으로 "실존 유형"이라고합니다. 이 방법으로 다형성 유형을 사용하면 유형 변수의 범위가 변경됩니다. 예를 들어, 유형 비교 :

type 'a t = { f : 'a -> int; } 
type u = { g : 'a. 'a -> int; } 

t 정말 유형의 가족, 'a의 각각의 가능한 값입니다. 'a t 유형의 각 값은 'a -> int 유형의 f 필드를 가져야합니다. 예 :

# let x = { f = fun i -> i+1; } ;; 
val x : int t = {f = <fun>} 
# let y = { f = String.length; } ;; 
val y : string t = {f = <fun>} 

비교해 보면 u은 단일 유형입니다. u 유형의 각 값은 의 경우 'a -> int 인 모든 필드가 g이고'a 인 필드가 있어야합니다. 예를 들면 : g 전혀 입력의 종류에 의존하지 않는 것을 여기

# let z = { g = fun _ -> 0; } ;; 
val z : u = {g = <fun>} 

참고; 그럴 경우에는 'a. 'a -> int 유형이 아닙니다. 예 :

# let x2 = { g = fun i -> i+1; } ;; 
This field value has type int -> int which is less general than 'a. 'a -> int 
관련 문제