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

Car*_*aro -1 haskell list 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" _ _ _
Run Code Online (Sandbox Code Playgroud)

我怎样才能返回一个包含所有名字的列表:( ,Marie,)JohnJessie

bhe*_*ilr 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
Run Code Online (Sandbox Code Playgroud)

然后,你可以创建一个包含三个值的列表marie,john以及jessie

db :: [Person]
db = [marie, john, jessie]
Run Code Online (Sandbox Code Playgroud)

现在你可以使用许多内置的功能,如在此列表中操作mapfilter:

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

ages :: [Person] -> [Age]
ages people = map getAge people
Run Code Online (Sandbox Code Playgroud)

现在,如果你将它加载到GHCi中,你可以测试它

> ages db
[25, 26, 27]
Run Code Online (Sandbox Code Playgroud)

有些事情需要注意:

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

  • @Caro创建一个函数,它接受一个`Person`并返回一个`FName`,然后使用`map`.我会让你自己写一个'age`的例子,它应该是相当简单的. (3认同)