{-# LANGUAGE PatternSynonyms #-} tasty (Cupcake; Cookie) = True tasty (Liquorice; Raisins) = False f :: (Eq a, Show a) => a -> a -> Bool f a ((== a) -> True; show -> "yes") = True f _ _ = False small (abs -> (0; 1; 2); 3) = True -- -3 is not small small _ = False type Coll a = Either [a] (Set a) pattern None <- (Left []; Right (toList -> [])) case e of 1; 2; 3 -> x 4; (5; 6) -> y sane e = case e of 1 2 3 -> a 4 5;6 -> b 7;8 -> c insane e = case e of A _ _; B _ C -> 3 (D; E (Just _) Nothing) -> 4 F -> 5