Ich mache eine Übung, bei der ich eine Funktion schreiben muss, die alle Anfangsbuchstaben der Wörter einer Zeichenfolge groß schreibt. HierHaskell - Groß-/Kleinschreibung des ersten Buchstabens jedes Worts in einer Zeichenfolge
ist, was ich bisher getan:
upperFirst:: String -> String
upperFirst str = let
upperFirstForEachWord (firstLetter:others) = toUpper firstLetter : map toLower others
in unwords (map upperFirstForEachWord (words str))
Und so funktioniert es:
upperFirst "" = ""
upperFirst "hello friends!" = "Hello Friends!"
Aber auch:
upperFirst " " = ""
upperFirst " a a a " = "A A A"
Ich verliere die weißen Räume am Anfang, am Ende und die doppelten wegen der Funktion words
.
Wie kann ich sie rekursiv behalten (ohne an allen möglichen Fällen zu arbeiten)?
Vielen Dank für jede Hilfe!
Ich denke, jede Lösung mit 'Worten' leidet darunter:' unwords' und 'words' sind nicht perfekte Umkehrungen voneinander und wi ll immer führende/nachfolgende Whitespace zusätzlich zu Double/Triple/etc. Räume. Versuchen Sie, eine Lösung ohne "Wörter" oder "Unwörter" zu schreiben. Alternativ, siehe ['splitOn'] (https://hackage.haskell.org/package/split-0.2.2/docs/Data-List-Split.html), was diesbezüglich vorsichtiger ist. – hao
Versuchen Sie, eine rekursive Lösung zu schreiben, die der 'map' -Funktion ähnelt, aber auch ein Stück des Zustands' shallNextNonWhitespaceCharBeCapitalized :: Bool' durchläuft, dann sehen Sie, ob Sie in Data.List eine Funktion höherer Ordnung finden können, die diesen Rekursionstyp erfasst . – jberryman