F# 的char型別是一個 16 位元的值,用來表示文字中最小、可定址的組成單位,而且預設不可變。
char常值可以用單引號來定義:
let ch = 'A'
// => val ch: char = 'A'
字串是一連串的char。
你可以透過(從 0 開始的)索引,從字串中取出單一的char:
"Exercism"[4] // => 'c'
逐一走訪字串時,每一步都會得到一個char。
下一個範例為了方便起見,使用了高階函式和匿名函式。 這些之後會在課程大綱中正式介紹,不過目前你可以把它們想成一種簡潔的寫法,用來對字串中的字元寫迴圈。
Seq.map (fun c -> c, int c) "F#" // => [('F', 70); ('#', 35)]
如上所示,char可以轉型成它的int值。
這在其他文字系統上也行得通(至少大部分時候):
Seq.map (fun c -> c, int c) "東京" // => [('東', 26481); ('京', 20140)]
比較字元時,實際上是比較底層的 Int16:
'A' < 'D' // => true
另外,int也可以轉型成char:
char 77 // => 'M'
System.Char函式庫包含了 .NET 語言該有的完整方法,例如大小寫轉換:
'a' |> System.Char.ToUpper // => 'A'
'Q' |> System.Char.ToLower // => 'q'
在這個練習中,你會實作一組部分的工具常式,用來協助開發者清理識別字名稱。
在這 6 個任務中,你會逐步建構出兩個函式:transform用來轉換單一字元,clean則用來轉換字串。
有效的識別字可以由零個或多個字母、底線、連字號、問號和表情符號組成。
如果傳入clean函式的是一個空字串,就應該回傳空字串。
實作transform函式,將任何連字號取代為底線。
transform '-' // => "_"
移除所有空白字元。 這也包含開頭和結尾的空白。
transform ' ' // => ""
修改transform函式,將 camelCase 轉成 kebab-case。
transform 'D' // => "-d"
修改transform函式,略過任何數字字元。
transform '7' // => ""
修改transform函式,將 'α' 到 'ω' 範圍內的希臘字母換成問號。
transform 'β' // => "?"
實作clean函式,將這些操作套用到整個字串。
不符合規則的字元應該原封不動地保留下來。
clean " a2b Cd-ω😀 " // => "ab-cd_?😀"
這個主題之後會在課程大綱中詳細介紹。
目前先知道有個叫做String.collect的高階函式可能會有幫助,它會使用你提供的函式,把一組char轉換成字串。
let transform ch = $"{ch}_"
String.collect transform "abc" // => "a_b_c_"