您好,我想问的是,除了case
或left-hand-side
模式匹配之外,是否还有其他方式可以对类型进行模式匹配。
data T=A Int | B Int |C Int | D Int
.... //许多情况
方法1
getType::T->Char
getType A _ = 'a'
getType B _ ='b'
...............
方法2:
getType::T->Char
getType x=case x of
A _ -> 'a'
B _ -> 'b'
...........
我上面的示例只是一个例子。.我假设如果要将数据构造函数的“ reflected”名称与它的lower-case-char
关联起来,我认为有一些简单的方法。
当您要实现模式匹配时,haskell中是否还有其他方法/构造让我更感到好奇。
答案 0 :(得分:2)
模式匹配是执行此操作的主要方法,其他任何方式都将根据模式匹配方法进行定义。通常,文本A
在运行时不会出现,因此普通代码无法将其视为字符串。
由于您已经说过上面的示例不是您正在使用的实际代码,因此我无法提供特定的样式建议。我个人有很多简单的功能,例如getType
。只有当我有成百上千行这样的代码,或者在经常更改的类型上时,我才开始寻找其他方法。
Haskell还具有丰富的编译时代码生成功能集。 GHC Generics和Template Haskell是两种功能强大且用途广泛的方式。两者均可用于减少样板。例如,aeson库可以使用数据构造函数和字段的名称来生成toJSON
和fromJSON
函数。 (实际上,它提供了两种实现,一种使用GHC Generics,一种使用Template Haskell。)无论哪种情况,生成的代码都将使用模式匹配,就像上面的示例一样。