还有其他方法可以用更少的代码来进行模式匹配吗?

时间:2018-10-18 15:02:32

标签: haskell pattern-matching

您好,我想问的是,除了caseleft-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中是否还有其他方法/构造让我更感到好奇。

1 个答案:

答案 0 :(得分:2)

模式匹配是执行此操作的主要方法,其他任何方式都将根据模式匹配方法进行定义。通常,文本A在运行时不会出现,因此普通代码无法将其视为字符串。

由于您已经说过上面的示例不是您正在使用的实际代码,因此我无法提供特定的样式建议。我个人有很多简单的功能,例如getType。只有当我有成百上千行这样的代码,或者在经常更改的类型上时,我才开始寻找其他方法。

Haskell还具有丰富的编译时代码生成功能集。 GHC GenericsTemplate Haskell是两种功能强大且用途广泛的方式。两者均可用于减少样板。例如,aeson库可以使用数据构造函数和字段的名称来生成toJSONfromJSON函数。 (实际上,它提供了两种实现,一种使用GHC Generics,一种使用Template Haskell。)无论哪种情况,生成的代码都将使用模式匹配,就像上面的示例一样。