Haskell——自定义数据类型

自定义类型

读 Haskell 代码时发现有两种自定义类型的方式,速成学习做以下记录。

data 关键字+枚举

1
2
3
4
5
6
7
data TopDecl =
DeclareType !TypeDecl
| DeclareConst !ConstDef
| DeclareNode !NodeDecl
| DeclareNodeInst !NodeInstDecl
| DeclareContract !ContractDecl
deriving Show

|分隔的 constructor,constructor 构造器本质上是返回某一类类型的函数。对于多个构造器放在一起柯里化后更好理解。

如果不加 deriving Show,则不是 Show 类型类实例,不能被 show 函数调用。

以及如果加上 deriving Eq,就可以直接使用==或/=来判断它们的值的相等性了。Haskell 会先检查两个值的构造器是否一致,再用==来检查其中的每一对字段的数据是否想等。

data 关键字+记录语法 record syntax

1
2
3
4
5
6
7
8
data Package = Package
{ packageName :: !Ident
, packageUses :: ![Ident]
, packageParams :: ![StaticParam] -- ^ Empty list for pacakges
, packageProvides :: ![PackageProvides]
, packageBody :: ![TopDecl]
, packageRange :: !SourceRange
} deriving Show

会自动创建多个函数,比如 packageName :: Package -> !Ident

允许按字段取值。