Ich verwechselte mit Modultyp in Ocaml.warum Modul-Typ in Ocaml verwenden?
Ich fragte mich, in welcher Situation sollten wir den Modultyp verwenden?
Normalerweise verwende ich Modul sig in .mli, um einige Details zu enthüllen, und setzen entsprechende Implementierung Modulstruktur in .ml.
Zum Beispiel:
.mli
module A:
sig
type t = T of string
end
.ml
module A =
struct
type t = T of string
end
Aus diesem Grund denke ich, Ocaml des Moduls wie .h und C-Datei in C.
Ich weiß, dass Modultyp eine Schnittstelle deklarieren kann, aber die Schnittstelle war nicht wie Java-Schnittstelle.
wie ein Beispiel in Buch:
open Core.Std
module type ID = sig
type t
val of_string : string -> t
val to_string : t -> string
end
module String_id = struct
type t = string
let of_string x = x
let to_string x = x
end
module Username : ID = String_id
module Hostname : ID = String_id
type session_info = { user: Username.t;
host: Hostname.t;
when_started: Time.t;
}
let sessions_have_same_user s1 s2 =
s1.user = s2.host
Der vorstehende Code hat einen Bug: es vergleicht den Benutzernamen in einer Sitzung mit dem Host in der anderen Sitzung, wann sollte es die Benutzernamen in den beiden zu vergleichen werden Fälle.
Es scheint, dass der Modultyp keinen neuen allgemeinen Supertyp für seine Implementierung bereitstellen kann.
Was die reale Anwendung für Modultyp ??
Ich nehme an, dass, wenn mein Zweck einige Details verbergen würde, Modul sig genug ist. – qc1iu
Was ist der gemeinsame Super-Typ von Benutzername.t und Hostname.t? Ich nehme an, dass Ocaml ** nicht mit ** Modultyp übereinstimmen kann. – qc1iu
@ qc1iu Es gibt keinen gemeinsamen Supertyp. Schließlich könnte einer von ihnen "string" und der andere "int" sein. Als Benutzer des Moduls können Sie nicht sehen, was genau der Typ ist, Sie können nur die Funktionen ausnutzen, die das Modul zur Verfügung stellt, um an diesem (abstrakten) Typ zu arbeiten. – chi