[Haskell-cafe] MultiCase alternative

Li-yao Xia lysxia at gmail.com
Thu Jun 15 14:42:44 UTC 2017

Hi Paul,

This looks like the or-patterns proposal:


I'm not sure what you call MultiCase though. Is the above what you were 
refering to?

Here are some alternatives with current Haskell, the first one is to be 

- Factor out the alternatives in a function.

         case x of
           C c -> f c
           D c -> f c
         f c = ...

- If your C and D constructors have similar enough meanings, you might 
want to fuse them into a single constructor with a separate tag:

       data T = A TA | B TB | CD CorD TC
       data CorD = C | D

   so that you can write

       case x of
         CD _ c -> ...

- With pattern synonyms + view patterns, although it takes some effort 
to set up and confuses the exhaustiveness checker.

       matchCorD :: T -> Maybe C
       matchCorD (C c) = Just c
       matchCorD (D c) = Just c
       matchCorD _ = Nothing

       pattern CD :: C -> T
       pattern CD c <- (matchCorD -> Just c)

   you can now write

       case x of
         CD c -> ...


On 06/15/2017 10:11 AM, Baa wrote:
> Hello, Everyone!
> As I understand "MultiCase" proposal was not approved, so my question
> is: is there alternatives to multi-case? I have code like:
>    case x of
>      A a -> ..
>      B b -> ..
>      C c -> --same--
>      D c -> --same--
> and I want to merge code of "C c" with "D c" branch. Anywhere, in
> general: is any alternatives to make "OR"s in patterns? I don't see how
> to do it with pattern guards, pattern synonyms, views extensions and
> don't see another related extensions.
> Something like "(C|D) c -> ..."
> ===
> Best regards, Paul
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.

More information about the Haskell-Cafe mailing list