如何组合案例陈述模式

时间:2015-03-25 01:49:01

标签: haskell ghc

我正在尝试在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

或者也许是另一种方法来清理它?

1 个答案:

答案 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

当然,如果foobar是长表达式,由于懒惰,您可以简单地将它们分解为本地定义,因此您只需要重复您需要的名称和任何模式变量参数:

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