使用字段标签定义数据类型
可以使用字段标签定义数据类型。
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 }
还有使用字段标签更新数据类型的特殊语法。