如果你想要用 Raspberry Pi 做點東西,大概就會用到_電阻_。在這個練習中,你只需要知道關於電阻的三件事:
每個電阻都有它的電阻值。
電阻很小,小到就算你把電阻值印在上頭,也很難看清楚。為了解決這個問題,製造商會在電阻上印上以顏色編碼的色帶,用來表示它們的電阻值。
每個色帶就像是數字中的一位數。舉例來說,如果印上 brown 色帶(值為 1),後面接著 green 色帶(值為 5),那就代表數字 15。在這個練習中,你要寫一個好用的小程式,這樣你就不用去記每個色帶代表的值。這個程式會接收 3 種顏色作為輸入,並以歐姆為單位輸出正確的數值。色帶的編碼方式如下:
black: 0
brown: 1
red: 2
orange: 3
yellow: 4
green: 5
blue: 6
violet: 7
grey: 8
white: 9
在 Resistor Color Duo 裡,你解碼了前兩種顏色。例如:orange-orange 會得到主要數值33。第三種顏色代表要在主要數值後面補上幾個零。主要數值加上這些零,就是電阻的歐姆值。在這個練習裡,歐姆實際上代表什麼並不重要。例如:
(如果你對數學很在行,也可以把這些零想成 10 的次方。如果你不愛數學,那就直接用零來想。兩者其實是同一件事,只是用白話說,而不是數學術語。)
這個練習要做的,是把顏色轉換成一段標籤:
"... ohms"
所以輸入"orange", "orange", "black"時,應該回傳:
"33 ohms"
當電阻比較大時,會用公制前綴來表示更大的歐姆數量級,例如 "kiloohms"。這就像說「2 公里」而不是「2000 公尺」,或是用「2 公斤」來表示「2000 公克」一樣。
例如,輸入"orange", "orange", "orange"時,應該回傳:
"33 kiloohms"
你需要實作label和ohms這兩個函式。你可以使用label提供的簽章,但別讓它限制了你的創意。
這個練習處理的是文字資料。基於歷史因素,Haskell 的String型別等同於[Char],也就是字元組成的陣列。如果要更有效率地處理文字資料,可以使用Text型別。
作為這個練習的選用延伸,你可以
閱讀 Haskell 的字串型別。
在 package.yaml 的相依項目清單中加入- text。
用以下方式匯入Data.Text:
import qualified Data.Text as T
import Data.Text (Text)
現在你可以寫出例如label :: Resistor -> Text,並以例如T.pack取用Data.Text的組合子。
查閱Data.Text的說明文件,
這個部分完全是選用的。