Ich schrieb eine Funktion, um Wortnummern für die Verarbeitung in Haskell zu säubern. Es muss in der Lage sein, -
in Leerzeichen (d. H. Fünfundvierzig wird fünfundvierzig) zu ändern und jeden anderen Nicht-Buchstaben zu löschen. Ich kann es rekursiv definieren, aber ich möchte wirklich etwas sauberer machen.Wie wenden Sie mehrere Fälle in einem Ersatz in Haskell an?
clean :: String -> String
clean "" = ""
clean ('-':cs) = ' ' : clean cs
clean (c:cs)
| isLetter c = c : clean cs
| otherwise = clean cs
Dies führte mich einen benutzerdefinierten Filter zu definieren, und eine von Data.List.Split basierend auf einem Kommentar zu this answer ersetzen zu definieren, da ich bereits Data.List.Split verwenden.
clean :: String -> String
clean = filter (\c -> isLetter c || c == ' ') . replace "-" " " . filter (/= ' ')
where
replace :: String -> String -> String -> String
replace old new = intercalate new . splitOn old
Diese Version ist insgesamt noch unordentlicher. Diese Version entfernt auch keine Leerzeichen in der ursprünglichen Zeichenfolge. Ist eine andere Konvention oder etwas eingebaut, die mir erlauben würde, dies mit einem sauberen One-Liner zu tun?
Danke dafür!Ich bin noch nicht auf 'bool' gestoßen. Es sieht so aus, als ob es im Grunde ein Wenn-sonst ist? – BrainFRZ
@BrainFRZ: Es ist ein * Katamorphismus * von 'Bool', aber für einen booleschen, das funktioniert tatsächlich wie ein' wenn-dann-sonst', mit 'bool'. –
@chi: ja, ich habe es in den Kommentar gemischt, danke :) –