2017-03-31 3 views
0

Wenn ich versuche, die folgende Funktion auszuführen, erhalte ich eine Fehlermeldung:eine Liste der Listen gegeben, eine Listh mit Listen Länge zurück (in einer anderen Liste)

len' [] = 0 
len' (_:xs) = 1 + len' xs 

listlon [] = 0 
listlon [[]] = 1 
listlon (x:xs) = ((len' x):(listlon xs)) 

functions.hs:41:1: error: • Non type-variable argument in the constraint: Num [a] (Use FlexibleContexts to permit this) • When checking the inferred type listlon :: forall a t. (Num [a], Num a) => [[t]] -> [a]

Kann mir jemand erklären, , Wie behebt man das? Was genau übermittelt dieser Fehler?

+0

Verwenden Sie immer Signaturen. Sie werden dem Leser und Ihnen Ihre Absichten klar machen und Ihnen helfen, die Fehlermeldungen zu verstehen. – Lazersmoke

Antwort

3

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.

Verwandte Themen