2016-05-03 4 views
1

Ich mache einen Code, um die Länge einer Liste mit Rekursion herauszufinden, aber es gibt eine Menge Fehler. Ich bin ein sehr Anfänger und ich kann nicht sehr gut Haskell. Hier ist der Code:Wie kann ich meinen Code verbessern, um die Länge einer Liste herauszufinden?

longListe :: [a] -> a 

longListe [] = error "Empty liste" 
longListe [x]= 1 
longListe n = 1 + longListe (n-1) 
main = print $ longListe 

und die Fehler:

No instance for (Num a) arising from the literal ‘1’ 
    Possible fix: 
     add (Num a) to the context of 
     the type signature for longListe :: [a] -> a 
    In the expression: 1 
    In an equation for ‘longListe’: longListe [x] = 1 

4-1-a.hs:6:31: 
    No instance for (Num [a]) arising from a use of ‘-’ 
    In the first argument of ‘longListe’, namely ‘(n - 1)’ 
    In the second argument of ‘(+)’, namely ‘longListe (n - 1)’ 
    In the expression: 1 + longListe (n - 1) 

4-1-a.hs:7:8: 
    No instance for (Show ([a0] -> a0)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from a use of ‘print’ 
    In the expression: print 
    In the expression: print $ longListe 
    In an equation for ‘main’: main = print $ longListe 

kann jemand mir bitte helfen. Danke

+0

Ein Problem: Sie tun '(n-1)' wo 'n' eine Liste ist. Sie können Integer-Operationen für eine Liste nicht ausführen. – dvaergiller

+1

Warum sollte 'longListe' einen Fehler auslösen anstatt 0 für eine leere Liste zurückzugeben? – chepner

Antwort

5

Das Problem liegt in der Typdefinition Ihrer Funktion: longListe :: [a] -> a.

Es funktioniert gut, wenn Sie longListe auf einer Liste der Nummer aufrufen. Wenn Sie beispielsweise longListe [1,2,3] aufrufen, lautet die Eingabe [Int] -> Int.

Wenn Sie jedoch versuchen, die Länge einer Liste von Zeichenfolgen abzurufen, wird dieser Typ . Dies ist nicht was Sie wollen, da Sie eine Nummer zurückgeben möchten.

Die Fehler, die Sie erhalten zeigen, dass:

Keine Instanz für (Num a) von der wörtlichen entstehen ‚1‘

Da Sie eine Nummer und tun numerische Operationen mit Eingabe zurückzukehren, der Compiler erwartet a eine Zahl daher der Fehler, der (Num a) erwähnt.

Wenn Sie die Definition in longListe :: [a] -> Int ändern, sollte es besser funktionieren (eigentlich wird es immer noch nicht funktionieren, aber aus einem anderen Grund, aber ich lasse Sie versuchen, dies selbst zu lösen, da dies der beste Weg ist zu lernen) .

Gibt es auch einen Grund, warum die leere Liste Fehler statt 0 zurückgeben sollte?

+0

Hmmm OK jetzt kommen diese Fehler – posh

+0

4-1-a.hs: 3: 16: Konnte nicht erwarteten Typ 'Int' mit tatsächlichen Typ '[Char]' Im Ausdruck: "Leere Liste" In einem Gleichung für 'longListe': longListe [] = "Leere Liste" 4-1-a.hs: 6: 8: Keine Instanz für (Show ([a0] -> Int)) (vielleicht haben Sie nicht genug Argumente für eine Funktion?) aus einer Verwendung von 'print' Im Ausdruck: print Im Ausdruck: print $ longListe In einer Gleichung für 'main': main = print $ longListe Fehlgeschlagen, Module geladen : keiner. – posh

+1

@posh Ich nehme an, Sie haben 'error' in' longListe [] = error "Empty liste" 'entfernt. Sie haben jetzt eine Diskrepanz zwischen Ihren Rückgabetypen. Manchmal gibt man eine Zahl zurück, manchmal eine Zeichenfolge ('[Char]' ist äquivalent zu 'String'). Sie müssen sicherstellen, dass die von Ihnen zurückgegebenen Werte immer vom gleichen Typ sind. –