在Haskell中,我定义了一个数据类型"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发布于 2022-10-18 12:55:54
通常这样做的方法是使用内置列表类型,而不是定义单独的PersonList类型。因此,Class将使用[Person]类型来代替PersonList类型,如下所示:
data Class
= Lecture String Room Teacher [Person] Date
| Lab String Room Teacher [Person] Int
deriving Show如果您真的想从头开始定义一个专用的PersonList类型,它应该如下所示:
data PersonList =
Empty | Node Person PersonList也就是说,"person list“要么是Empty,要么是由第一个"person”加上其余的"person list“组成的Node。这与定义内建列表类型的方式非常相似,只是内建类型与任何元素类型一起工作,而不仅仅是Person元素,而且有许多内置函数用于使用内置列表类型,如果尝试使用此PersonList类型,则必须重写这些函数。
发布于 2022-10-18 12:56:03
只需使用现有的列表类型,如[Person]或Vector Person。这里没有必要重新发明方向盘。如果要将其称为PersonList,请使用类型别名:
type PersonList = [Person]顺便说一句,对于复杂的数据类型,您确实应该使用记录语法,特别是如果要对成员进行注释的话。例如,您当前的Date实现要求某人每次需要了解正在发生的事情时,都要查看定义中的注释。您可以用记录语法将这些注释形式化:
data Date = DMY
{ day :: Int
, month :: Int
, year :: Int -- it's unlikely you need years beyond 9223372036854775807 C.E.
}https://stackoverflow.com/questions/74111076
复制相似问题