Wie Alec sagte, haben Sie vergessen, die leere Liste zu behandeln.
Um diese Art von Fehler in Zukunft zu vermeiden, empfehle ich dringend, Warnungen unter Verwendung -Wall
zu aktivieren. Dadurch überprüft GHC, ob die Muster zur Kompilierungszeit (Definitionszeit) vollständig sind.
Prelude> :set -Wall
Prelude> :{
Prelude| qs(x:xs) = qs left ++ [x] ++ qs right
Prelude| where left = [ y | y <- xs, y < x]
Prelude| right = [ y | y <- xs, y >= x ]
Prelude| :}
<interactive>:12:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘qs’: Patterns not matched: []
Wie man sehen kann, weist sie darauf hin, dass []
nicht abgestimmt wurde.
Hier ist ein weiteres Beispiel, wo wir die leere Liste und die Listen beginnend mit x,y
behandeln, aber wir vergessen zu handhaben Listen mit einem Element (Muster des Formulars [_]
).
Prelude> :{
Prelude| f [] = 0
Prelude| f (x:y:xs) = 0
Prelude| :}
<interactive>:18:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘f’: Patterns not matched: [_]
Hinzufügen f [x] = 0
würde ausreichen. (Natürlich erhalten wir dann Warnungen für alle unbenutzten Variablen, die in diesen Mustern vorkommen.)
Sie könnten einen Basisfall für die leere Liste hinzufügen: 'qs [] = []'. – Alec
@Alec das hat es getan. Bitte erstellen Sie eine Antwort – javadba