You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

存在的问题

  1. 命名冲突与类型不匹配:PersonList的构造器Person和已定义的Person类型重名,编译器无法区分;同时Person构造器原本需要String String Date三个参数,这里仅传入PersonList,类型不兼容,无法正确存储人员数据。
  2. 链表结构错误:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:05:22