2009-04-17 9 views
0

Ich erhalte, was ein Vorrang Problem scheint zu sein, eine SML-Funktion, Ersatz in Aufruf:SML Funktionsaufruf analysiert nicht Argumente als Argument

fun substitute v new (typevar q) = ... 

Und ich rufe diese von einer anderen Funktion:

fun new_type_vars (typevar v) non_gens = 
        substitute v new_var() (typevar v) 

Aber ich erhalte eine Fehlermeldung:

 
    C:/sml/type_checker.sml:22.48-23.44 Error: operator and operand don't agree [tycon mismatch] 
     operator domain: type_exp 
     operand:   unit -> string 
     in expression: 
     (substitute v) new_var 

Welche scheint darauf hinzudeuten, dass es (Ersatz v) zu nennen versucht, eine nd rufen Sie dann das Ergebnis dieses Aufrufs mit dem Argument new_var auf.

Ich habe versucht, Klammern um die ganze Sache, aber das hilft nicht, und wenn ich Klammer um die Argumente wie (v new_var...) hinzufügen, denkt es, dass v eine Funktion Anwendung auf new_var ist. Was ist mit diesem Funktionsaufruf los?

Antwort

1

Sie wollen wahrscheinlich ändern

substitute v new_var() (typevar v) 

zu

substitute v (new_var()) (typevar v) 

(boutta Antwort erklärt, warum.)

1

Ich verstehe nicht alles, da Sie nicht alle Arten der verschiedenen Operationen und Variablen geben.

Aber das allgemeine Problem, das Sie haben, ist, wie Sie bereits erraten haben, führt SML die Funktionsaufrufe (und bindet die Variablen) von der linken Seite. Hier ein Beispiel:

fun f a:int b:int c:string = ... 

f ist somit eine Funktion des Typs int -> int -> string -> ... und fügt implizit die Klammern Spaß (((fa: int) b: int) c: int) = ...

Dies bedeutet, dass Sie es zum Beispiel wie folgt verwendet werden:

var f2 = f 3; 

und f2 nun den Typ int -> string -> ...

Verwandte Themen