首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义"PersonList“,它可以存储任意数量的"person”

如何定义"PersonList“,它可以存储任意数量的"person”
EN

Stack Overflow用户
提问于 2022-10-18 12:34:19
回答 2查看 83关注 0票数 1

在Haskell中,我定义了一个数据类型"Person“。现在我想要定义一个列表,它可以存储任意数量的人。目标是能够将任意数量的人添加到另一个称为"Class“的数据类型中。

以下是我的尝试:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-18 12:55:54

通常这样做的方法是使用内置列表类型,而不是定义单独的PersonList类型。因此,Class将使用[Person]类型来代替PersonList类型,如下所示:

代码语言:javascript
复制
data Class
 = Lecture String Room Teacher [Person] Date
 | Lab String Room Teacher [Person] Int
 deriving Show

如果您真的想从头开始定义一个专用的PersonList类型,它应该如下所示:

代码语言:javascript
复制
data PersonList =
  Empty | Node Person PersonList

也就是说,"person list“要么是Empty,要么是由第一个"person”加上其余的"person list“组成的Node。这与定义内建列表类型的方式非常相似,只是内建类型与任何元素类型一起工作,而不仅仅是Person元素,而且有许多内置函数用于使用内置列表类型,如果尝试使用此PersonList类型,则必须重写这些函数。

票数 2
EN

Stack Overflow用户

发布于 2022-10-18 12:56:03

只需使用现有的列表类型,如[Person]Vector Person。这里没有必要重新发明方向盘。如果要将其称为PersonList,请使用类型别名:

代码语言:javascript
复制
type PersonList = [Person]

顺便说一句,对于复杂的数据类型,您确实应该使用记录语法,特别是如果要对成员进行注释的话。例如,您当前的Date实现要求某人每次需要了解正在发生的事情时,都要查看定义中的注释。您可以用记录语法将这些注释形式化:

代码语言:javascript
复制
data Date = DMY
  { day   :: Int
  , month :: Int
  , year  :: Int -- it's unlikely you need years beyond 9223372036854775807 C.E.
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74111076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档