具有記錄引數的自定義資料型別

假設我們要建立一個資料型別 Person,它有姓名,年齡,電話號碼,街道,郵政編碼和城鎮。

我們可以寫

data Person = Person String String Int Int String String String

如果我們現在想獲得電話號碼,我們需要提供一個功能

getPhone::Person -> Int
getPhone (Person _ _ _ phone _ _ _) = phone

嗯,這不好玩。我們可以使用引數做得更好:

data Person' = Person' { firstName     :: String
                       , lastName      :: String
                       , age           :: Int
                       , phone         :: Int
                       , street        :: String
                       , code          :: String
                       , town          :: String }

現在我們得到函式 phone 在哪裡

:t phone
phone::Person' -> Int

我們現在可以做任何我們想做的事,例如:

printPhone::Person' -> IO ()
printPhone = putStrLn . show . phone

我們還可以通過模式匹配來繫結電話號碼 :

getPhone' :: Person' -> Int
getPhone' (Person {phone = p}) = p

為便於使用引數,請參閱 RecordWildCards