2015-11-28 8 views
6

Wenn ich versuche, ein parametrisiertes Modul zu schreiben, das = auf einen nicht angegebenen Typ aufruft, der vom Parameter geliefert wird, löst SML/NJ einen Typfehler aus. Zum Beispiel, wenn ichGibt es eine Möglichkeit, die Parameter-Signatur eines Funktors zu beschränken, damit der Parameter einer Struktur nicht spezifizierte Gleichheitstypen liefern kann?

signature SIG = 
sig 
    type t 
end 

eine Unterschrift habe und versuchen, ein Modul F über ein Modul S mit der Unterschrift SIG

functor F (S : SIG) = 
struct 
    fun f (x:S.t) (y:S.t) = (x = y) 
end 

ich die folgenden Kompilierung-Fehler zu parametrieren auslösen:

Error: operator and operand don't agree [equality type required] 
    operator domain: ''Z * ''Z 
    operand:   S.t * S.t 
    in expression: 
    x = y 

Wie kann ich angeben, dass S.t ein Gleichheitstyp sein soll?

Die einzige Abhilfe, die ich der Lage gewesen, so weit, um herauszufinden, ist auch die Gleichheit Funktion in der Struktur, über die Versorgung der Funktor parametriert dh:

signature SIG' = 
sig 
    type t 
    val eq : (''a * ''a) -> bool 
end 

functor F' (S' : SIG') = 
struct 
    fun f' x y = S'.eq (x, y) 
end 


structure A = F'(struct 
        type t = int 
        val eq = (op =) 
        end) 

Es scheint, als gäbe es einen besseren Weg geben muss obwohl ich auch etwas Grundlegendes und Wichtiges darüber falsch verstehe, wie Funktoren arbeiten sollen.

Antwort

6

Sie müssen nur angeben, dass t ein eqtype:

signature SIG = 
sig 
    eqtype t 
end 
+1

O jeez! Ich weiß nicht, wie ich noch nie zuvor auf dieses Keyword gestoßen bin! Ich darf die Dokumentation nicht hervorragend lesen. Vielen Dank! –