2016-10-05 2 views
3

Ich bin gerade in Haskell, und ich versuche, eine Funktion zu machen, die eine Liste von Zahlen geben wird eine Liste aller negativen Zahlen darin zurückgeben. Also habe ich dieseHaskell Fehler erhalten, wenn Listenparameter mehr als ein Element hat

negative:: [Int] -> [Int] 

negative [x] = [z | z <- [x], x < 0] 

Als ich es mit nur ein Element in der Liste versuchen, es so funktioniert es sollte

negativ [-1] returns [-1]

negativ [1] returns []

Allerdings, wenn ich mehr Zahlen addieren, wie zum Beispiel negativ [0, -1] ich erhalte den folgenden Fehler:

Pro gram error: Musterübereinstimmungsfehler: negativ [Num_fromInt instNum_v30 0, Num_fromInt instNum_v30 -1]

Ich habe versucht, die Zahlen mit Leerzeichen und ohne Leerzeichen einzugeben, aber das Ergebnis ist das gleiche. Ich vermute, dass etwas mit meinem Code nicht stimmt, aber da ich mich immer noch an Haskell gewöhnt habe, fällt es mir schwer, ihn zu finden. Jede Hilfe wird geschätzt.

+0

Dieser Fehler tritt häufig auf SO auf. Ich frage mich, ob es irgendwo irgendwo einen Kurs/Tutorial gibt, der Anfänger dazu bringt, '[x]' als Notation für eine willkürliche Liste anstelle einer Singleton-Liste zu verwenden. – chi

Antwort

3

einfach die [x] in der linken Seite des Ausdrucks mit x, ersetzen und die Expression x < 0-z < 0 (Erinnern wir einzelne Elemente Ausfiltern der Behälter selbst nicht) ändern.

Hier ist, wie ich es tun würde:

negative :: [Int] -> [Int] 
negative x = [z | z <- x, z < 0] 

(Optional) Hier ist, wie Sie das gleiche Problem höherer Ordnung Funktionen lösen könnte:

negative :: [Int] -> [Int] 
negative xs = filter (< 0) xs 

(Wenn Sie don Ich weiß nicht, was Funktionen höherer Ordnung sind, ignoriere einfach das vorhergehende Beispiel. Du wirst über sie erfahren, während du weitergehst.

Verwandte Themen