你的父母向你和你兄弟姊妹發起挑戰,要來一場二對二籃球賽。 他們自信滿滿,覺得自己一定會贏,於是先讓你們拿下幾分,接著才開始接管比賽。 為了提振士氣,你開始說起 Pig Latin,那是一種虛構的兒童語言,非兒童很難聽懂。 這下你就能佔上風,擊敗你的父母了!
你的任務是把英文翻譯成 Pig Latin。 這個翻譯由四條規則定義,這些規則會看單字開頭的母音與子音的模式。 這些規則會看每個單字如何使用母音和子音:
a、e、i、o 和 u
如果單字以母音開頭,或以 "xr" 或 "yt" 開頭,就在單字結尾加上 "ay" 的音。
例如:
"apple" -> "appleay"(以母音開頭)"xray" -> "xrayay"(以 "xr" 開頭)"yttria" -> "yttriaay"(以 "yt" 開頭)如果單字以一個或多個子音開頭,先把那些子音移到單字結尾,然後在單字結尾加上 "ay" 的音。
例如:
"pig" -> "igp" -> "igpay"(以單一子音開頭)"chair" -> "airch" -> "airchay"(以多個子音開頭)"thrush" -> "ushthr" -> "ushthray"(以多個子音開頭)如果單字以零個或多個子音後面接著 "qu" 開頭,先把那些子音(如果有的話)和 "qu" 部分移到單字結尾,然後在單字結尾加上 "ay" 的音。
例如:
"quick" -> "ickqu" -> "ickquay"(以 "qu" 開頭,前面沒有子音)"square" -> "aresqu" -> "aresquay"(以一個子音後面接著 "qu" 開頭)如果單字以一個或多個子音後面接著 "y" 開頭,先把 "y" 前面的子音移到單字結尾,然後在單字結尾加上 "ay" 的音。
來看幾個例子:
"my" -> "ym" -> "ymay"(以單一子音後面接著 "y" 開頭)"rhythm" -> "ythmrh" -> "ythmrhay"(以多個子音後面接著 "y" 開頭)單元測試提供了一些單字的範例。試著將子音分組,不要受限於單元測試中那些特定的子音組合。
這個練習處理的是文字資料。基於歷史因素,Haskell 的String型別等同於[Char],也就是字元的陣列。若要更有效率地處理文字資料,可以使用Text型別。
作為這個練習的選用延伸,你可以試試看:
閱讀 Haskell 中字串型別的相關介紹。
在 package.yaml 的相依項目清單中加入 - text。
用以下方式匯入Data.Text:
import qualified Data.Text as T
import Data.Text (Text)
你現在可以寫出例如translate :: Text -> Text,並用例如T.isSuffixOf來呼叫Data.Text的組合子。
查閱Data.Text的說明文件,
這個部分完全是選用的。