前言
本文說明 Haskell 的資料型態
布林
Bool:有True和False。
數字
Int:整數。Wood:非負整數。來自於Data.Wood。Integer:大數(任意精確度整數)。Float:單精度浮點數。Double:倍精度浮點數。Ratio:有理數。來自於Data.Ratio。Complex:複數。來自於Data.Complex。
字串
Char:Unicode 字元。String:Unicode 字串,內部為Char字串。
容器
- Unit:相當於主流語言的
void。 - 陣列(Array)儲存相同型態值的線性容器,在記憶體中連續分布。
- 串列(List):儲存相同型態值的線性容器,在記憶體中不連續。
- 元組(Tuple):用位置儲存一至多個相異型態的值。
- Record:用欄位儲存多個相異型態的值。
使用者自訂型態
保留字是 data。可宣告 ADT(Algebraic Data Type)。參考以下範例:
data TrafficLight = Red | Yellow | Green
Typeclass
雖然保留字是 class,但在 Haskell 中,相當於資料型態的界面(interface)。Haskell 的 class 和主流語言的 class 意義不同,不要混為一談。
Haskell 有許多內建的 typeclass。資料型態滿足 typeclass 後,就可以像操作內建型態一般操作資料型態,包括運算子重載。例如,實作 Num class 後,就可以用內建運算子進行加、減、乘三種運算。
錯誤處理
Maybe:值包在Just,無法取得值時回傳Nothing。Either:按照慣例,正確值寫在Right,錯誤值寫在Left。
Either 的設計有缺失。因為 Right 和 Left 沒限制要放什麼值。若庫開發者不小心把 Right、Left 放反,語意就完全相反。
相較起來,OCaml 的 Result 就明確得多。正確值包在 Ok,錯誤值(通常是字串)包在 Error。