2014-06-09 3 views
0

나는 OCaml의에서이 정말 기본 클래스가 있습니다간단한 OCaml의 데이터 구조

class handler rule callback methods = 
    object(self) 
     method matches test_string test_method = 
      let r = Str.regexp rule in 
      match Str.string_match r test_string 0 with 
      | false -> false 
      | true -> methods = [] || List.exists (fun nth_method -> nth_method = test_method) methods 
    end 

하지만 그것은 컴파일 할 수 없습니다 (파일이 handler.ml입니다) :

File "handler.ml", line 1, characters 6-339: 
Error: Some type variables are unbound in this type: 
    class handler : 
     string -> 
     'a -> 'b list -> object method matches : string -> 'b -> bool end 
    The method matches has type string -> 'b -> bool where 'b is unbound 

비교해 보면 꽤 이해할 수 있습니다. test_methodmethods의 요소가 같은 유형이 될 것으로 예상됩니다. 게다가, 타입 시스템은 분명히 타입이 모두 'b이라는 것을 알기 때문에, 왜 그것이 문제가됩니까? (공식적으로, methods 문자열의 목록입니다.)

답변

5

하는의이 같은 문제에 하나의 작은이 예를 축소하자

# class c things = object(self) method m thing = List.mem thing things end;; 
Error: Some type variables are unbound in this type: 
     class c : 'a list -> object method m : 'a -> bool end 
     The method m has type 'a -> bool where 'a is unbound 

참고 오류가 언 바운드 형태 변수가 아닌 관한 것이라고 형식이 일치하지 않습니다.

문제는 클래스 정의와 관련이 있습니다. 독립형 개체를 정의하는 경우 괜찮습니다.

fun things -> object(self) method m thing = List.mem thing things end;; 
- : 'a list -> < m : 'a -> bool > = <fun> 

개체 유형이 다형성에 어떻게주의해야합니다. 클래스는 형식 유형이 아니라 형식입니다. c을 정의하려고하면 변수 'a이 언 바운드 상태로 유지됩니다. 클래스 정의는이 유형 변수에서 다형성을 유지합니다. 따라서 정의하는 것은 유형이있는 클래스가 아니라 유형을 매개 변수화 한 클래스 패밀리입니다. 유형 스키마는 유형에 대해 매개 변수화 된 유형의 패밀리입니다.

OCaml의 당신은 매개 변수화 클래스를 정의 할 수 있습니다,하지만 당신은 명시 적으로 매개 변수를 선언해야합니다

# type 'a t = 'a c;; 
type 'a t = 'a c 
:

# class ['a] c (things : 'a list) = object(self) method m thing = List.mem thing things end;; 
class ['a] c : 'a list -> object method m : 'a -> bool end 

당신은이 클래스에 해당하는 유형은 하나 개의 인수와 매개 변수화 유형인지 확인할 수 있습니다

methods은 문자열 목록이어야하지만 작성한 코드에서는 아무 것도 지정하지 않아도됩니다. 정의를 제한하려면 유형 어노테이션을 추가해야합니다. methods을 문자열 목록으로 제한하는 코드를 더 작성하면 제거 할 수 있습니다.

# class c (things : string list) = object(self) method m thing = List.mem thing things end;; 
class c : string list -> object method m : string -> bool end 

자세한 내용은 Ocaml manual §3.10 Objects — Parametrized classes를 참조하십시오 ... methodstest_methodmatches에 - 당신은 당신이 원하는 위치 유형 주석을 넣을 수 있습니다.

+0

좋습니다. 고맙습니다! 이것은 매우 도움이되었습니다. – eatonphil