1.10 自訂資料型別
本章目前為止給讀者看到的 data 定義其實都是 Haskell 已內建的型別。
使用者也可自己定義新資料型別。
例如,我們可能定義一個新型別表達四個方向:
data Direction = North | East | South | West
或著定義一個表示顏色的型別,用三個浮點數表達紅、綠、藍的比例:
data RGBColor = RGB Float Float Float
例:土耳其藍(turquoise)可寫成 RGB 0.25 0.875 0.8125.
下列函數則降低一個顏色的彩度:
這是一個簡便的做法:算出該顏色的灰度 gr,
然後計算每個原色與該灰度的線性內插。
更準確的作法應將 RGB 轉成 HSV,以後者調整飽和度。
desaturate :: Float -> RGBColor -> RGBColor
desaturate p (RGB r g b) =
RGB (r +. p *. (gr -. r)) (g +. p *. (gr -. g)) (b +. p *. (gr -. b))
where gr = r *. 0.299 +. g *. 0.587 +. b *. 0.144
我們也可定義如 List 一樣的遞迴資料型別。
例如,資料結構中可能談到兩種二元樹狀結構,一種僅在內部節點有標示(稱作 internally labelled),另一種僅在葉節點有表示(稱作 externally labelled)。
這兩種二元樹可分別表示如下:
data ITree a = Null | Node a (ITree a) (ITree a)
data ETree a = Tip a | Bin (ETree a) (ETree a)
怎麼編寫這種資料結構上的程式呢?我們將在下一章中說到。