2012-11-24 2 views
5

두 개의 모듈이 있습니다. 하나는 변형 유형 정의Ocaml의 약어 생성자 이름

module A = struct 
    type foo = Bar of material | Baz | Boo 

    (* other stuff *) 
end 

을 나는의 생성자로 다른 모듈

module B = struct 
    type foo = A.foo (* I can abbreviate A.foo by assigning it a local alias *) 

    let f (x : foo) = match x with 
    | Bar m  -> Bar (g m) (* Any way to abbreviate Bar and friends? *) 
    | Baz | Boo -> x 
end 

에서 왼쪽 손으로 측면으로 만 "referring to named objects" I 당 모두 변형 foo를 사용할 수 있도록하고 싶습니다 U를 방지 건너 뛸 수있는 방법이 있습니까

let f (x : foo) = match x with 
    | A.Bar m   -> A.Bar (g m) 
    | A.Baz | A.Boo -> x 

하십시오 모듈 경로로 변형 이름을 접두사해야 open의 짧은 모듈 경로를 노래하고 A에서 다른 모든 것들을 가져 오겠습니까?

답변

9

당신은 로컬로 열 수 있습니다

let f (x : foo) = A.(match x with 
    | Bar m  -> Bar (g m) 
    | Baz | Boo -> x) 

또는

let f (x : foo) = 
    let open A in 
    match x with 
    | Bar m  -> Bar (g m) 
    | Baz | Boo -> x) 

당신은 서브 모듈에 Bar을 정의 할 수 있습니다 작은 일들이 노출되도록 :

module A = struct 
    module BasicDataAndOps = struct 
    type foo = Bar of material | Baz | Boo 
    end 
    open BasicDataAndOps 
    (* other stuff *) 
end 

module B = struct 
    open A.BasicDataAndOps 
    ... 

을 외부 사용을 위해 패턴에서 B에서 "스마트 생성자"를 정의 할 수 있습니다.

let bar m = A.Bar m 

약속 : Ashish Argwal의 대답 : type foo = A.foo = Bar of material | Baz | Boo에 설명되어있는 유형 정의를 다시 쓸 수 있는지 잊어 버렸습니다. 귀하의 예에서 이미 유형 약어가있는 것을 감안할 때 이것은 가장 좋은 대답입니다.

type-based label disambiguation에 도움이 될 수있는 작업이 있지만 언어로 받아 들여지지 않을 수 있습니다.

+0

브릴리언트. 감사. –

+1

"뒷이야기"작업으로 [유형 기반 레이블 동음 이의 해제 제안] (http://gallium.inria.fr/~scherer/gagallium/resolving-field-names/)을 참조한 경우 (1) 그것은 결국 받아 들여지지 않을 것입니다. 그리고 (2) 그것은 레코드 라벨뿐만 아니라 (비 다형성) 변형 생성자에서도 작동해야합니다. – gasche

+1

OCaml에서 'open in'문법을 ver 3.12에서 상향으로 사용할 수 있습니다. – didierc

2

lukstafi가 준 답변 외에도 B.foo을 정의 할 때 생성자를 다시 상태로 표시 할 수 있습니다.

module A = struct 
    type foo = Bar | Baz 
end 

module B = struct 
    type foo = A.foo = Bar | Baz 

let f (x : foo) = match x with 
    | Bar -> "bar" 
    | Baz -> "baz" 

end 
+0

[3.2] (http://askra.de/software/ocaml-doc/3.12/manual016.html#toc54)의 * type-equation * 비트입니까? –