je les suivantes:Y compris un module engloutit son type
Un type de module Person
avec des méthodes pour obtenir le nom et prénom:
module type Person = sig
type t
val first : t -> string
val last : t -> string
end
Un foncteur PersonUtils
d'étendre Person
avec une fonction name
:
module PersonUtils (Person: Person) : sig
type t
val name : t -> string
end = struct
include Person
let name p = Person.first p^" "^Person.last p
end
et un module Main
comme suit:
module Main : sig
type t
val name : t -> string
end = struct
include PersonUtils(struct
type t = {
first: string;
last: string;
}
let first p = p.first
let last p = p.last
end)
end
En Main
, je voudrais ajouter une fonction loud_first_name
supplémentaire: donc j'ajouter ce qui suit à la signature et le module:
module Main : sig
type t
val name : t -> string
(* New *)
val loud_first_name : t -> string
end = struct
include PersonUtils(struct
type t = {
first: string;
last: string;
}
let first p = p.first
let last p = p.last
end)
(* New *)
let loud_first_name p = String.uppercase p.first
end
Cependant, il semble que loud_first_name
ne sait plus la structure de mon tapez t
, donc je suis à gauche avec l'erreur Unbound record field first
.
Ma question est: comment puis-je créer des méthodes telles que loud_first_name
afin qu'ils puissent toujours accéder à mes champs d'enregistrement? J'ai essayé de déplacer mon niveau t
, mais j'ai eu du mal à l'utiliser dans l'argument de mon foncteur.
module Main : sig
type t
val name : t -> string
val loud_first_name : t -> string
end = struct
type t_ = {
first: string;
last: string;
}
include PersonUtils(struct
type t = t_
let first p = p.first
let last p = p.last
end)
(* Signature mismatch:
...
Values do not match:
val loud_first_name : t_ -> string
is not included in
val loud_first_name : t -> string
*)
let loud_first_name p = String.uppercase p.first
end
Merci! J'ai été capable de me débarrasser de la non-concordance des signatures dans mon dernier exemple. Mais est-il possible d'éviter le type t = t_'? Si j'inline 'tape t = {first: string; ...} 'alors ma méthode' loud_first_name' est toujours incapable de voir ses champs. –
Vous pouvez essayer 'type nonrec t = t'. Il se référera au 't 'dans la portée, pas à celui qui est défini. –
Merci @ ÉtienneMillon! Je ne connaissais pas cette syntaxe. Pourtant, le module que j'inclus fait que mon type 't' soit un doublon (et j'obtiens un message d'erreur). Peut-être que j'utilise incorrectement 'include'? –