Haskell中如何定义可存任意Person的PersonList并用于Class类型
Haskell中实现存储多Person的Class类型
已定义Person数据类型,需要实现可存储任意数量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
存在的问题
- 命名冲突与类型不匹配:
PersonList的构造器Person和已定义的Person类型重名,编译器无法区分;同时Person构造器原本需要String String Date三个参数,这里仅传入PersonList,类型不兼容,无法正确存储人员数据。 - 链表结构错误:当前
PersonList的定义无法实现“存储任意数量Person”的需求,因为它要么是空,要么是一个错误的Person构造器调用,没有实际存储单个Person的节点结构。
修正方案
方案一:自定义正确的PersonList链表
重新定义PersonList,使用不同的构造器名(比如Cons)来表示链表节点,每个节点存储一个Person和后续的列表:
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 -- 修正后的PersonList:Empty表示空列表,Cons表示包含一个Person和后续列表的节点 data PersonList = Empty | Cons Person PersonList deriving Show data Teacher = Teacher String deriving Show data Class = Lecture String Room Teacher PersonList Date |Lab String Room Teacher PersonList Int deriving Show
使用示例:
-- 创建一个日期 birthDate = DMY 15 3 2000 -- 创建Person student1 = Person "Alice" "Smith" birthDate student2 = Person "Bob" "Jones" (DMY 20 5 1999) -- 创建PersonList classStudents = Cons student1 (Cons student2 Empty) -- 创建教室 classRoom = Room "A101" 30 True -- 创建教师 teacher = Teacher "Mr. Brown" -- 创建Lecture mathLecture = Lecture "Math 101" classRoom teacher classStudents (DMY 1 9 2024)
方案二:直接使用Haskell内置列表
Haskell自带的[Person]类型就是专门用来存储任意数量Person的列表,无需自定义PersonList,代码更简洁:
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 Teacher = Teacher String deriving Show -- 直接用[Person]替代自定义的PersonList data Class = Lecture String Room Teacher [Person] Date |Lab String Room Teacher [Person] Int deriving Show
使用示例:
birthDate = DMY 15 3 2000 student1 = Person "Alice" "Smith" birthDate student2 = Person "Bob" "Jones" (DMY 20 5 1999) classStudents = [student1, student2] classRoom = Room "A101" 30 True teacher = Teacher "Mr. Brown" mathLecture = Lecture "Math 101" classRoom teacher classStudents (DMY 1 9 2024)
内容的提问来源于stack exchange,提问作者timedestoyer444
相关产品推荐
相关产品推荐

