Wie @EricFulmer schreibt in seiner Antwort, (a:b:xs)
entspricht Listen mit zwei oder mehr Elemente. So Ihre Funktion arbeitet wie:
format [] = ... -- empty list
format (a:b:xs) = ... -- two or more
Und Haskell warnt, dass eine Liste mit einem Element [_]
wird keine dieser Linien entsprechen: beide Muster scheitern.
Sie sollten daher eine Klausel hinzufügen, um festzulegen, was die Liste ein Element in dem Fall geschehen soll, enthält, zum Beispiel (und wahrscheinlich):
format [email protected][_] = a
Wo @
ist ein alias Operator und es bindet mit einer Liste mit genau einem Element.
In voller erhalten wir dann:
format :: String -> String
format [] = []
format [email protected][_] = a
format (a:b:xs)
| a == 'W' && b == 'U' = " " ++ format (drop 1 xs)
| otherwise = a : format (b:xs)
wir die Funktion elegant mehr machen können, um durch die Vergleiche in die Musterabgleich bewegen:
format :: String -> String
format [] = []
format [email protected][_] = a
format ('W':'U':xs) = format $ drop 1 xs
format (a:b:xs) = a : format (b:xs)
nun der letzte Fall kann in vereinfacht werden :
format (a:xs) = a : format xs
und jetzt die zweite Klausel (unser format [email protected][_]
) wird veraltet, da die letzte Klausel auch diesen Fall behandelt. So drehen wir die Funktion in:
format :: String -> String
format [] = []
format ('W':'U':xs) = format $ drop 1 xs
format (a:xs) = a : format xs
Ich persönlich denke, dies ist mehr elegant ist, da hier klar ist, was Sie wollen mit dem zweiten Muster übereinstimmen (Sie müssen nicht eine Folge von Bedingungen schreiben). Außerdem kann man fast syntaktisch sehen, dass die Funktion alle möglichen Eingaben verarbeitet.
Wenn Sie Warnungen mit "-Wall" aktivieren, warnt GHC während der Kompilierung darüber und weist darauf hin, dass der fehlende Fall übereinstimmt. Empfohlen. – chi