Die Linie
listlon [] = 0
erzeugt die Ausgabe 0
anstelle von etwas vom Typ [a]
. Sie haben wahrscheinlich listlon [] = []
gemeint. Ich schlage jedoch vor, listlon = map length
oder listlon = map len'
. Oder vielleicht verstehe ich einfach nicht, was du wirklich willst. In einem ersten Schritt hilft es immer, die beabsichtigte Signatur zur Verfügung zu stellen. Stimmt es, dass Sie nach einer Funktion listlon :: [[a]] -> [Int]
sind?
Wenn mein Verständnis ist richtig, ist die direkteste fix wäre:
listlon [] = []
listlon [x] = [len' x]
listlon (x:xs) = len' x : listlon xs
Diese die Typen behebt. Aber man kann feststellen, dass die zweite Gleichung redundant ist, und dies ist ausreichend
listlon [] = []
listlon (x:xs) = len' x : listlon xs
und jetzt können Sie feststellen, dass dies in der Tat Mapping len'
über die Liste, damit map len'
als pointfree Definition von listlon
.
Der Fehler besagt, dass der Compiler über den Rückgabetyp verwirrt wurde. Sie versuchen, eine Num
durch Literale 0
und 1
sowie in Form einer Liste (von der letzten Zeile erstellt) zurückgeben. Die Bedingung Num [a]
ist nur mit der Erweiterung FlexibleContexts
möglich. Aber es zeigt nur das oben beschriebene Problem an. Diese Art von Fehlermeldungen sind manchmal verwirrend, weil der Compiler Ihre Gedanken nicht lesen kann. Daher wird davon ausgegangen, dass Sie wissen, was Sie tun, und nur ein Problem meldet, wenn aufgrund eines Konflikts nicht mehr mit den Typen geschlussfolgert werden kann.
Verwenden Sie immer Signaturen. Sie werden dem Leser und Ihnen Ihre Absichten klar machen und Ihnen helfen, die Fehlermeldungen zu verstehen. – Lazersmoke