Zuerst haben Sie einen Tippfehler in Ihrem rekursiven Aufruf an lengthZ
. Dies zu beheben, in denen wir einen neuen Typ Fehler:
No instance for (Num a)
Was wir, dass die Funktion (+)
, um erzählt zu bedienen ist, wir die typeclass Num
als Einschränkung in unserer Typdeklaration enthalten muss. Wir fügen auch eine andere Typvariable für die Elemente der Liste ein, so dass die Funktion auf Listen angewendet werden kann, die Elemente eines beliebigen Typs enthalten. Wir schreiben also die Funktion wie folgt:
lengthz :: Num b => [a] -> b
lengthz [] = 0
lengthz n = 1 + lengthz (tail n)
die nur funktioniert, wie wir erwarten würden:
ghci>> lengthz [1,2,3]
3
ghci>> lengthz []
0
Beachten Sie, dass "Schwanz" am besten zu vermeiden ist, da es Ihr Programm zum Absturz bringen kann, wenn Sie die leere Liste übergeben. Sie sollten stattdessen (vollständige) Mustererkennung verwenden, wenn möglich, die nicht das gleiche Problem hat - z. 'längez (x: xs) = 1 + längez xs'. – chi