在Haskell中访问自定义数据类型的成员

时间:2012-04-11 23:55:21

标签: haskell

假设我在Haskell中有以下自定义数据类型和函数:

data Person = Person { first_name :: String, 
                       last_name :: String,
                       age :: Int 
                     } deriving (Eq, Ord, Show)

如果我想创建一个函数print_age来打印一个人的年龄,如下所示:print_age (Person "John" "Smith" 21),我如何编写print_age来访问年龄参数?我是一个面向对象的人,所以我不在这里。我基本上在寻找相当于Person.age。

3 个答案:

答案 0 :(得分:49)

函数应用程序是前缀,因此age person将对应于OOP语言中常见的person.age()。可以通过函数组合

定义print_age函数
print_age = print . age

或点满

print_age person = print (age person)

答案 1 :(得分:18)

这称为记录语法,LYAH has a good section on it(“记录语法”的ctrl-f)。

当使用记录定义数据类型时,Haskell自动定义与记录同名的函数作为访问器,因此在这种情况下age是age字段的访问者(它具有类型{{1 } {},同样适用于Person -> Intfirst_name

这些是普通的Haskell函数,因此称为last_nameage person

答案 2 :(得分:6)

除了其他答案中提到的age功能外,有时使用模式匹配也很方便。

print_age Person { age = a } = {- the a variable contains the person's age -}

有一个非常无害的扩展,允许你跳过命名位:

{-# LANGUAGE NamedFieldPuns #-}
print_age Person { age } = {- the age variable contains the person's age -}

...和另一个,各种社区成员对不同程度的不信任看待,这使你甚至可以跳过说出你想要进入范围的字段:

{-# LANGUAGE RecordWildCards #-}
print_age Person { .. } = {- first_name, last_name, and age are all defined -}