2015-10-02 12 views
5

In OCaml, ho due tipi di moduli che definiscono un tipo t:Come unire i tipi di modulo (firme) di OCaml che definiscono lo stesso tipo?

module type Asig = sig 
    type t 
    val a : t 
end 

module type Bsig = sig 
    type t 
    val b : t 
end 

voglio per automatizzare la creazione di un tipo di modulo loro fusione. Voglio creare un tipo di modulo equivalente a:

module type ABsig_manual = sig 
    type t 
    val a : t 
    val b : t 
end 

ho provato

module type ABsig = sig 
    include Asig 
    include Bsig 
end 

ma questo non riesce con Error: Multiple definition of the type name t. Sembra impossibile aggiungere un vincolo di tipo allo include quindi sono bloccato.

Contesto: Ho un modulo di AB che fa implementare entrambe le firme e voglio dargli da mangiare ad un funtore come:

module MakeC(AB) = struct 
    type t = AB.t list 
    let c = [AB.a; AB.b] 
end 

module C = MakeC(AB) 

potrei usare due argomenti come in:

module UglyMakeC(A : Asig)(B : Bsig with type t = A.t) = struct 
    type t = A.t list 
    let c = [A.a; B.b] 
end 

module C = UglyMakeC(AB)(AB) 

ma questo (è brutto e) non si adatta bene a più funtori o più firme per fondersi.

Quindi, come posso automatizzare unire questi due tipi di modulo? Posso modificare A e B secondo necessità ma voglio tenerli separati. Inoltre, forse il mio approccio è completamente sbagliato, e in tal caso mi piacerebbe che i segnalatori di una direzione migliore.

Type sharing in OCaml - typechecker error è correlato ma unisce moduli, non tipi di modulo.

+0

Hai pensato di chiedere su 'caml-list @ inria.fr'? –

risposta

10

Ecco il modo per farlo:

module type Asig = sig 
    type t 
    val a : t 
end 

module type Bsig = sig 
    type t 
    val b : t 
end 

module type ABsig = sig 
    include Asig 
    include Bsig with type t := t 
end 

Si chiama "sostituzione distruttivo".

+3

Per riferimento futuro, questo è documentato in "Estensioni della lingua", paragrafo "Sostituzione all'interno di una firma" (http://caml.inria.fr/pub/docs/manual-ocaml/extn.html#sec234), che estende ciò che è descritto in "The OCaml Language", paragrafo "Tipi di moduli" (http://caml.inria.fr/pub/docs/manual-ocaml/modtypes.html). – jacquev6

Problemi correlati