2010-12-16 5 views
6

ich dieses Stück Code haben:SML Liste Gleichheit oddness

fun foldr2(f, x::xs) = 
    if xs = [] then 
     x 
    else 
     f(x, foldr2(f, xs)) 

Mit dem Typ Signatur

(''a * ''a -> ''a) * ''a list -> ''a 

Sieht ziemlich geradlinig, dauert es eine Funktion, die über die Gleichstellung Typen und einer Liste funktioniert des Gleichheitstyps als Argumente, wegen des Vergleichs xs = []. Aus irgendeinem Grund funktioniert es bei Eingabe wie (op +, [2.3, 2.7, 4.0]), wenn in SML/NJ Reals kein Gleichheitstyp ist. Kann mir jemand helfen, etwas Licht darüber zu bekommen, warum diese Magie auftritt?

+1

+1, ich frage mich auch, warum das funktioniert. Es ist, als ob SML/NJ den Bedingungsblock in "null [2.3, 2.7, 4.0]" oder ähnliches übersetzt. –

Antwort

2

Ich glaube, es ist mit der magischen Art und Weise zu tun, in der + für Reals überlastet ist. Für mich ist das fast Rand auf einen Compiler-Fehler, obwohl ich auf die SML97-Definition sehen müsste, um genau zu sehen, was das richtige Verhalten gemeint ist. Die Überladung über + ist so etwas wie eine böse dunkle Ecke in SML, IMHO.

Zum Beispiel, wenn Sie eine Funktion definieren, die vom Typ real * real -> real und passieren, dass als Argument an foldr2 Sie den Typ Fehler erhalten Sie erwartet hatten:

fun f (x : real * real) = 134.5 
foldr2 (f, [1.4, 2.25, 7.0]) 
    stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required] 

Sie können auch, wenn Sie den Typ Fehler induzieren Fügen Sie einfach op + eine Typ-Annotation hinzu, was mich zu der Schlussfolgerung führte, dass es die Überladung von + ist, die den mysteriösen Effekt verursacht.