2015-03-25 36 views
5

我试图匹配case语句中的许多不同构造函数。为了简单起见,在一半情况下我们做同样的事情,另一半我们做其他事情。即使我分解出的逻辑给另一个函数,我还是要这样写:如何组合case语句模式

case x of 
    C1 -> foo x 
    C2 -> foo x 
    ... 
    C10 -> bar x 
    C11 -> bar x 
    ... 

有一些方法,使case语句的行为用C更像switch语句(即下通),或让我可以一次匹配多种图案之一,如:

case x of 
    C1, C2, C3 -> foo x 
    C10, C11, C12 -> bar x 

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

+0

我为'foo'和'bar'制作了'x'参数,因为这是我的用例。它还可以防止使用单独的分区函数将等价构造函数合并为一个常见情况的丑陋但正确答案(例如'C1 - > C1,C2 - > C1,C3 - > C1',然后只匹配'C1') 。 – crockeea 2015-03-25 02:01:15

回答

8

这些被称为析取模式,和Haskell没有他们。 (OCaml和F#)。但是,有几个典型的解决方法。如果你的类型是一个枚举,您可以用平等,例如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 
+0

非常感谢! – bemihai22 2017-12-01 13:41:09