2014-11-07 12 views
5

Data una firma A con un tipo di dati t, diconoCome evitare la ripetizione del tipo di dati SML in strutture e firme?

signature A = sig 
    datatype t = T of int | S of string 
end 

E 'possibile fornire un'implementazione (una struttura) che non hanno t ripetuto? Ad esempio, nella seguente firma, viene ripetuta la definizione di t. Va bene per piccoli tipi di dati, ma un po 'goffi per quelli più grandi.

structure AImpl : A = struct 
    datatype t = T of int | S of string 
end 

La mia intenzione è semplicemente quella di fornire un'interfaccia, in modo che si possano conoscere tutte le dichiarazioni. Ma non voglio che ogni implementazione ripeta la definizione del datatype.

Anche se sembra che una firma e una struttura possano includere entrambi un tipo di dati da un'altra struttura, uno non sarebbe in grado di conoscere la dichiarazione del tipo di dati esaminando solo la firma. Per esempio:

structure AData = struct 
    datatype t = T of int | S of string 
end 

signature A = sig 
    datatype t = datatype AData.t 
end 

structure a : A = struct 
    open AData 
end 

Naturalmente, questo approccio, anche se non che soddisfacente, è accettabile se metto sia AData e A nello stesso file .sig.

risposta

1

No, è impossibile a causa del modo in cui le regole di corrispondenza delle firme funzionano in sml.

Quando si introduce un tipo non astratto nella firma di ogni struttura con , questa firma deve fornire lo stesso tipo di associazione. Il motivo è che le firme in sml si usano principalmente per nascondere i dettagli della struttura.

Ad esempio è possibile utilizzare tipo astratto per nascondere i dettagli tipo di dati da parte degli utenti della struttura:

signature A = 
sig 
    type t 
end 


structure AImpl :> A = 
struct 
    datatype t = T of int | S of string 
end 

Oppure si può esporre solo tipo costruttore:

signature A = 
sig 
    type t 
    val T : int -> t 
end 


structure AImpl :> A = 
struct 
    datatype t = T of int | S of string 
end 

val test = AImpl.T 12; 
+0

che abbia senso. La firma è per nascondere l'implementazione. Ho solo pensato che avrei potuto mettere le funzioni ausiliarie in un'altra struttura (annidata) e aprirla. – shhyou

Problemi correlati