2016-06-09 16 views
1

Ich versuche, eine SML-Funktion zu schreiben, die zwei Argumente hat, die erste ist eine Int und die zweite ist eine Liste von Listen. Das Ziel ist, das erste Argument an die Vorderseite jeder Liste im zweiten Argument einzufügen. Zum Beispiel sollte append_to_front(1,[[3,4],[6,8],[]])[[1,3,4],[1,6,8],[1]] zurückgeben.SML: Fehler: Operator und Operand stimmen nicht überein [Tycon Mismatch]

Ich habe den Code:

fun append_to_front(a:int, L:int list list) = 
    if L = [] 
    then [] 
    else a::hd(L)::append_to_front(a, tl(L)); 

und ich erhalte die Fehlermeldung: Fehler: Operator und Operand nicht einverstanden [Tycon Mismatch]. Warum?

+2

Sie können dies auch mit einer Funktion höherer Ordnung lösen: 'fun append_to_front (x, L) = Karte (Fn xs => x :: xs) L' –

Antwort

3

Der Cons-Operator :: hat den Typ 'a * 'a list -> 'a list, dh es erfordert ein Element auf der linken Seite und eine Liste auf der rechten Seite. Darüber hinaus ist es rechtsassoziativ, d. H. a::b::c = a::(b::c).

In Ihrem Fall hat aint, b und c beide int list haben Typ eingeben. Folglich ist die zweite Verwendung von :: nicht gut typisiert, weil es eine Liste auf beiden Seiten hat. Verwenden Sie stattdessen die Listenverkettung @ an dieser Stelle.

+1

Vielen Dank für Ihre Hinweise. Ich habe mein Problem gelöst, indem ich (a :: hd (L)) Klammern hinzugefügt habe. –