haskell 如何定义一个可以存储任意数量“人员”的“人员列表”

4uqofj5v  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(139)

在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
35g0bw71

35g0bw711#

通常的做法是使用内置列表类型,而不是定义一个单独的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类型,则必须自己重写这些函数。

ca1c2owp

ca1c2owp2#

只需使用现有的列表类型,如[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.
  }

相关问题