2012-03-25 13 views
0

Ich versuche, eine Funktion in Standard ml, die eine Liste von Paaren von Ints nimmt, und ich sollte eine Liste von Int, die das maximale Element aus den Paaren enthält zurückgeben. (int * int) list -> int list. Nun, bis jetzt habe ich einen Code geschrieben, aber es funktioniert nicht und ich kann das Problem nicht von dem Fehler ablesen, den es gab.max Paare Funktion Standard ml

Hier ist der Code:

- fun maxpairs x = 
= foldr (fn (a, b) => if a > b then a else b) [] x; 

Und hier ist der Fehler Ich erhalte:

stdIn:15.2-15.50 Error: operator and operand don't agree [overload] 
    operator domain: 'Z 
    operand:   'Y list 
    in expression: 
    (foldr (fn (<pat>,<pat>) => if <exp> then <exp> else <exp>)) nil 

Antwort

1

foldr eine Funktion vom Typ nimmt ('a * 'b) -> 'b, einen Wert vom Typ 'b und eine Liste des Typs ['a] . In Ihrem Fall ist die Liste eine Liste von Paaren und der Wert vom Typ 'b ist eine leere Liste. Das heißt in der Funktion fn (a,b) => ... wird a ein Paar sein und b wird eine Liste sein. Sie versuchen dann, a und b mit > zu vergleichen. Da > nicht mit einem Paar als linker Operand und einer Liste als sein rechter Operand verwendet werden kann, funktioniert das nicht. Sie können auch keine if-Anweisung haben, wenn der then-Ausdruck und der else-Ausdruck unterschiedliche Typen haben.

Wenn ich Sie wäre würde ich Karte für diese verwenden, die das Problem besser als die Verwendung einer Falte scheint passen.

+0

Ohh okay, ich sehe Es funktionierte mit der Kartenfunktion Vielen Dank sepp2k –