在Haskell中,我定义了一个数据类型“Person”。现在我想定义一个List,它可以存储任意数量的Person。目标是能够将任意数量的人添加到另一个称为“Class”的数据类型中。
以下是我的尝试:
data Date = DMY
Int -- day
Int -- month
Integer -- year
deriving Show
data Person = Person
String -- first name
String -- last name
Date -- birthday
deriving Show
data Room =
Room
String -- name of room
Int -- capacity of students
Bool -- computer access for students
deriving Show
data PersonList =
Empty | Person PersonList
deriving Show
data Class =
Lecture String Room Teacher PersonList Date
|Lab String Room Teacher PersonList Int
deriving Show
data Teacher = Teacher String deriving Show
2条答案
按热度按时间35g0bw711#
通常的做法是使用内置列表类型,而不是定义一个单独的
PersonList
类型。因此,Class
将使用类型[Person]
代替类型PersonList
来定义,如下所示:如果您 * 真的 * 想从头开始定义一个专用的
PersonList
类型,它应该是这样的:也就是说,“person list”是
Empty
或者是由第一个“person”加上“person list”的其余部分组成的Node
.这与定义内置列表类型的方式非常相似,除了内置类型适用于任何元素类型而不是仅适用于Person
元素,并且有很多内置函数用于处理内置列表类型,如果您尝试使用PersonList
类型,则必须自己重写这些函数。ca1c2owp2#
只需使用现有的列表类型,如
[Person]
或Vector Person
。无需在此重新发明。如果您想将其称为PersonList
,请使用类型别名:顺便说一句,对于复杂的数据类型,您确实应该使用记录语法,特别是如果您无论如何都要对成员进行注解的话。例如,您当前的
Date
实现需要有人在每次需要了解发生了什么的时候查看定义中的注解。您可以用记录语法形式化这些注解: