Der char-Typ in F# ist ein 16-Bit-Wert, der die kleinsten adressierbaren Bestandteile eines Textes darstellt und standardmäßig unveränderlich ist.
chars können als Literale mit einfachen Anführungszeichen definiert werden:
let ch = 'A'
// => val ch: char = 'A'
Strings sind eine Folge von chars.
Ein einzelnes char kann mit (nullbasierter) Indexierung aus einem String abgerufen werden:
"Exercism"[4] // => 'c'
Beim Iterieren über einen String wird bei jedem Schritt ein char zurückgegeben.
Das nächste Beispiel verwendet der Einfachheit halber eine Funktion höherer Ordnung und eine anonyme Funktion. Diese werden später im Lehrplan richtig behandelt, aber für den Moment sind sie im Wesentlichen eine kompakte Möglichkeit, eine Schleife über die Zeichen in einem String zu schreiben.
Seq.map (fun c -> c, int c) "F#" // => [('F', 70); ('#', 35)]
Wie oben gezeigt, kann ein char in seinen int-Wert umgewandelt werden.
Das funktioniert (zumindest manchmal) auch für andere Schriftsysteme:
Seq.map (fun c -> c, int c) "東京" // => [('東', 26481); ('京', 20140)]
Beim Vergleichen von Zeichen wird der zugrunde liegende Int16-Wert verwendet:
'A' < 'D' // => true
Außerdem kann ein int in ein char umgewandelt werden:
char 77 // => 'M'
Die System.Char-Bibliothek enthält den vollständigen Satz von Methoden, die man von einer .NET-Sprache erwartet, wie etwa Umwandlungen in Groß- und Kleinbuchstaben:
'a' |> System.Char.ToUpper // => 'A'
'Q' |> System.Char.ToLower // => 'q'
Bei dieser Übung implementierst du eine Teilmenge von Hilfsroutinen, mit denen ein Entwickler Bezeichnernamen bereinigen kann.
In den 6 Aufgaben baust du nach und nach die Funktionen transform zum Umwandeln einzelner Zeichen und clean zum Umwandeln von Strings auf.
Ein gültiger Bezeichner besteht aus null oder mehr Buchstaben, Unterstrichen, Bindestrichen, Fragezeichen und Emojis.
Wenn ein leerer String an die Funktion clean übergeben wird, sollte ein leerer String zurückgegeben werden.
Implementiere die Funktion transform, um alle Bindestriche durch Unterstriche zu ersetzen.
transform '-' // => "_"
Entferne alle Whitespace-Zeichen. Das umfasst auch Whitespace am Anfang und am Ende.
transform ' ' // => ""
Ändere die Funktion transform so, dass sie camelCase in kebab-case umwandelt
transform 'D' // => "-d"
Ändere die Funktion transform so, dass sie alle Zeichen weglässt, die numerisch sind.
transform '7' // => ""
Ändere die Funktion transform so, dass sie alle griechischen Buchstaben im Bereich 'α' bis 'ω' ersetzt.
transform 'β' // => "?"
Implementiere die Funktion clean, um diese Operationen auf einen ganzen String anzuwenden.
Zeichen, die außerhalb der Regeln liegen, sollten unverändert durchgereicht werden.
clean " a2b Cd-ω😀 " // => "ab-cd_?😀"
Dieses Thema wird später im Lehrplan ausführlich behandelt.
Für den Moment könnte es nützlich sein zu wissen, dass es eine Funktion höherer Ordnung namens String.collect gibt, die eine Sammlung von chars mithilfe einer Funktion, die du bereitstellst, in einen String umwandelt.
let transform ch = $"{ch}_"
String.collect transform "abc" // => "a_b_c_"
Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.