使用字段标签定义数据类型

可以使用字段标签定义数据类型。

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 }

还有使用字段标签更新数据类型的特殊语法。