具有记录参数的自定义数据类型

假设我们要创建一个数据类型 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