使用欄位標籤定義資料型別
可以使用欄位標籤定義資料型別。
data Person = Person { age::Int, name::String }
此定義與普通記錄定義不同,因為它還定義了* 記錄訪問器,可用於訪問資料型別的各個部分。
在這個例子中,定義了兩個記錄訪問器 age
和 name
,它們允許我們分別訪問 age
和 name
欄位。
age::Person -> Int
name::Person -> String
記錄訪問器只是由編譯器自動生成的 Haskell 函式。因此,它們像普通的 Haskell 函式一樣使用。
通過命名欄位,我們還可以在許多其他上下文中使用欄位標籤,以使我們的程式碼更具可讀性。
模式匹配
lowerCaseName::Person -> String
lowerCaseName (Person { name = x }) = map toLower x
我們可以繫結位於相關欄位標籤位置的值,同時模式匹配新值(在本例中為 x
),該值可用於定義的 RHS。
模式與 NamedFieldPuns
匹配
lowerCaseName::Person -> String
lowerCaseName (Person { name }) = map toLower name
相反,NamedFieldPuns
擴充套件允許我們只指定我們想要匹配的欄位標籤,然後在定義的 RHS 上隱藏該名稱,因此引用 name
指的是值而不是記錄訪問器。
模式與 RecordWildcards
匹配
lowerCaseName::Person -> String
lowerCaseName (Person { .. }) = map toLower name
使用 RecordWildCards
進行匹配時,所有欄位標籤都會進入範圍。 (在這個具體的例子中,name
和 age
)
這個擴充套件稍有爭議,因為如果你不確定 Person
的定義,還不清楚如何將值納入範圍。
記錄更新
setName::String -> Person -> Person
setName newName person = person { name = newName }
還有使用欄位標籤更新資料型別的特殊語法。