如何从给定数据类型的列表中提取字段列表?

时间:2016-03-13 03:23:12

标签: list haskell algebraic-data-types

如果我已经定义了一个数据类型,比如5个属性。我怎样才能创建其中一个属性的列表。

前:

data Person = Person name fname sexe age height

Marie, John, Jessie :: Person
Marie = Person "Marie" _ _ _
John = Person "John" _ _ _
Jessie = Person "Jessie" _ _ _

如何返回包含所有名称的列表:(MarieJohnJessie

2 个答案:

答案 0 :(得分:6)

您的代码无效Haskell。你可能有

data Person = Person FName LName Sexe Age Height
type FName = String
type LName = String
data Sexe = Male | Female
type Age = Int
type Height = Float

marie, john, jessie :: Person
marie = Person "Marie" "Lastname1" Female 25 165
john = Person "John" "Lastname2" Male 26 180
jessie = Person "Jessie" "Lastname3" Female 27 170

然后,您可以使用

创建包含三个值mariejohnjessie的列表
db :: [Person]
db = [marie, john, jessie]

现在,您可以使用许多内置函数(例如mapfilter)对此列表进行操作:

getAge :: Person -> Age
getAge (Person _ _ _ age _) = age

ages :: [Person] -> [Age]
ages people = map getAge people

现在,如果将其加载到GHCi中,您可以将其作为

进行测试
> ages db
[25, 26, 27]

有些注意事项:

  • 如果未构建数据类型,则必须声明所有数据类型。
  • 使用data TypeName = ConstructorName <FieldTypes>
  • 声明新类型
  • 使用type AliasName = ExistingType
  • 声明类型别名
  • 类型名称和构造函数必须以大写字母开头
  • 值名称必须以小写字母开头。

答案 1 :(得分:1)

您可以使用提取名称的函数map覆盖列表:

map (\ (Person name _ _ _ _) -> name) people

如果您的数据类型被定义为记录,请执行以下操作:

data Person = Person
  { personName, personFName, personSex :: String
  , personAge, personHeight :: Int
  }

然后你可以简单地说map personName people