使用欄位標籤定義資料型別

可以使用欄位標籤定義資料型別。

data Person = Person { age::Int, name::String }

此定義與普通記錄定義不同,因為它還定義了* 記錄訪問器,可用於訪問資料型別的各個部分。

在這個例子中,定義了兩個記錄訪問器 agename,它們允許我們分別訪問 agename 欄位。

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 進行匹配時,所有欄位標籤都會進入範圍。 (在這個具體的例子中,nameage

這個擴充套件稍有爭議,因為如果你不確定 Person 的定義,還不清楚如何將值納入範圍。

記錄更新

setName::String -> Person -> Person
setName newName person = person { name = newName }

還有使用欄位標籤更新資料型別的特殊語法。