學習軌道
/
F#
F#
/
練習
/
一乾二淨
一乾二淨

一乾二淨

學習練習

簡介

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函式的是一個空字串,就應該回傳空字串。

1. 將遇到的連字號換成底線

實作transform函式,將任何連字號取代為底線。

transform '-'  // => "_"

2. 移除所有空白

移除所有空白字元。 這也包含開頭和結尾的空白。

transform ' '  // => ""

3. 將 camelCase 轉成 kebab-case

修改transform函式,將 camelCase 轉成 kebab-case。

transform 'D'  // => "-d"

4. 略過數字字元

修改transform函式,略過任何數字字元。

transform '7'  // => ""

5. 將希臘小寫字母換成問號

修改transform函式,將 'α' 到 'ω' 範圍內的希臘字母換成問號。

transform 'β' // => "?"

6. 組合這些操作來處理字串

實作clean函式,將這些操作套用到整個字串。

不符合規則的字元應該原封不動地保留下來。

clean "  a2b Cd-ω😀  " //  => "ab-cd_?😀"

從字元組合成字串

這個主題之後會在課程大綱中詳細介紹。

目前先知道有個叫做String.collect的高階函式可能會有幫助,它會使用你提供的函式,把一組char轉換成字串。

let transform ch = $"{ch}_"
String.collect transform "abc"  // =>  "a_b_c_"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
F# Exercism

準備好開始 一乾二淨 了嗎?

註冊 Exercism,透過 18 個概念148 個練習 和真人引導來學習並精通 F#,全部免費。