1 值、函數、與定義

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) 

怎麼編寫這種資料結構上的程式呢?我們將在下一章中說到。