They are called disjunctive patterns, but Haskell doesn't have them. (OCaml and F # do.) However, there are several typical workarounds. If your type is an enum, you can use equality, for example elem :
case cond of c | c `elem` [C1, C2, C3] -> foo | c `elem` [C10, C11, C12] -> bar | otherwise -> baz
And, of course, if foo or bar are long expressions, thanks to laziness, you can simply decompose them into local definitions, so you only need to repeat the name and any template variables that you need as arguments:
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
source share