在 Haskell 中,我定義了一個資料型別“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
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
uj5u.com熱心網友回復:
這樣做的常用方法是使用內置串列型別,而不是定義單獨的PersonList型別。因此,Class將使用 type[Person]代替type 來定義PersonList,如下所示:
data Class
= Lecture String Room Teacher [Person] Date
| Lab String Room Teacher [Person] Int
deriving Show
如果你真的想PersonList從頭開始定義一個專用型別,它會是這樣的:
data PersonList =
Empty | Node Person PersonList
也就是說,“人員串列”是Empty由Node第一個“人員”加上“人員串列”的其余部分組成的。這與定義內置串列型別的方式非常相似,只是內置型別適用于任何元素型別而不是僅適用于Person元素,并且有很多內置函式可用于內置串列型別如果您嘗試使用這種PersonList型別,則必須自己重寫。
uj5u.com熱心網友回復:
只需使用現有的串列型別,例如[Person]or Vector Person。這里沒有必要重新發明輪子。如果您想將其稱為 a 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://www.uj5u.com/ruanti/517109.html
標籤:列表哈斯克尔
