我正在尝试在case语句中匹配许多不同的构造函数。为简单起见,假设在一半的情况下我们做同样的事情,而在另一半我们做其他事情。即使我将逻辑分解为另一个函数,我仍然要编写:
case x of
C1 -> foo x
C2 -> foo x
...
C10 -> bar x
C11 -> bar x
...
是否有某种方法可以使案例陈述的行为更像C中的switch
陈述(即通过试穿),或者我可以同时匹配多种模式中的一种,例如:
case x of
C1, C2, C3 -> foo x
C10, C11, C12 -> bar x
或者也许是另一种方法来清理它?
答案 0 :(得分:9)
这些被称为析取模式,而Haskell没有它们。 (OCaml和F#do。)然而,有一些典型的解决方法。如果您的类型是枚举,则可以使用相等,例如elem
:
case cond of
c
| c `elem` [C1, C2, C3] -> foo
| c `elem` [C10, C11, C12] -> bar
| otherwise -> baz
当然,如果foo
或bar
是长表达式,由于懒惰,您可以简单地将它们分解为本地定义,因此您只需要重复您需要的名称和任何模式变量参数:
case cond of
C1 x -> foo x
C2 y -> foo y
...
C10 -> bar
C11 -> bar
...
where
foo x = something long (involving x, presumably)
bar = if you please then something else quite long