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.
Hai pensato di chiedere su 'caml-list @ inria.fr'? –