你在一間製作線上多人遊戲的公司工作,這款遊戲叫做 Lexiconia。
要玩這款遊戲,每位玩家會拿到 13 個字母,他們必須重新排列這些字母來組成單字。 不同的字母有不同的點數,因為用某些字母組成單字就是比其他字母容易。
這款遊戲最初以英文推出,但非常受歡迎,現在公司也想拓展到其他語言。
不同的語言需要支援不同的字母點數。 字母的點數取決於它在該語言中相較於其他字母的使用頻率。
例如,字母「C」在英文中相當常見,只值 3 分。 但在挪威文中它是很罕見的字母,值 10 分。
為了讓新增語言更容易,你的團隊需要改變遊戲中字母及其點數的儲存方式。
你的任務是改變遊戲中字母及其點數的資料格式。
目前,字母是依照分數分組儲存的,形成一對多的對應關係。
這裡需要改成把每個字母各自與其分數一起儲存,形成一對一的對應關係。
作為這項變更的一部分,團隊也決定把字母改為小寫,而不再是大寫。
如果你想看看資料原本的結構,以及它需要怎麼改變,可以看看測試套件裡的範例。
這個練習會處理文字資料。基於歷史因素,Haskell 的String型別與[Char]是同義的,也就是字元的陣列。如果需要更有效率地處理文字資料,可以使用Text型別。
如果你想為這個練習多做一點,可以試試以下選用的延伸內容:
閱讀 Haskell 的字串型別。
在 package.yaml 的相依套件清單中加入- text。
用下列方式匯入Data.Text:
import qualified Data.Text as T
import Data.Text (Text)
現在你可以寫出例如transform :: Map Int Text -> Map Char Int這樣的型別簽名,並用例如T.toLower來取用Data.Text的組合子。
查閱Data.Text的文件。
這個部分完全是選用的。