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

List 如何从给定数据类型的列表中提取字段列表?,list,haskell,algebraic-data-types,List,Haskell,Algebraic Data Types,如果我定义了一个具有5个属性的数据类型。如何创建其中一个属性的列表 例: 如何返回包含所有姓名的列表:(Marie,John,Jessie)您可以使用提取姓名的函数在列表上映射: map (\ (Person name _ _ _ _) -> name) people 如果您的数据类型定义为记录,如下所示: data Person = Person { personName, personFName, personSex :: String , personAge, person

如果我定义了一个具有5个属性的数据类型。如何创建其中一个属性的列表

例:


如何返回包含所有姓名的列表:(
Marie
John
Jessie

您可以使用提取姓名的函数在列表上映射:

map (\ (Person name _ _ _ _) -> name) people
如果您的数据类型定义为记录,如下所示:

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

然后您可以简单地说
映射personName people

您的代码无效。你本来可以的

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
然后您可以创建一个包含三个值的列表,分别是
marie
john
jessie

db :: [Person]
db = [marie, john, jessie]
现在,您可以使用许多内置函数对此列表进行操作,如
map
filter

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

ages :: [Person] -> [Age]
ages people = map getAge people
现在,如果您将其加载到GHCi中,您可以将其作为

> ages db
[25, 26, 27]
需要注意的一些事项:

  • 如果不是内置的,则必须声明所有数据类型
  • 使用
    data TypeName=ConstructorName
  • 使用
    type AliasName=ExistingType
  • 类型名称和构造函数必须以大写字母开头
  • 值名称必须以小写字母开头

谢谢!但我想要的是返回一份(玛丽、约翰、杰西)。。。在他们的名字列表中。。不是作为对象列表。@Caro创建一个函数,该函数接受
Person
并返回
FName
,然后使用
map
。我让你自己写,以
age
为例,应该相当简单。
> ages db
[25, 26, 27]