1{-# LANGUAGE PatternSynonyms, BangPatterns, PolyKinds, DataKinds, GADTs, 2 FlexibleContexts, ViewPatterns #-} 3{-# LANGUAGE ExplicitForAll #-} 4 5pattern Single x <- [x] 6 7 8single :: [a] -> Maybe a 9single (Single x) = Just x 10single _ = Nothing 11 12pattern Single :: a -> [a] 13pattern Single x = [x] 14 15 16pattern Single :: () => (Show a) => a -> [a] 17pattern Single x = [x] 18 19f :: (Show a) => [a] -> a 20f (Single x) = x 21 22pattern SinglePair :: (a, a) -> [(a, a)] 23pattern SinglePair x = [x] 24 25f :: (Show a) => [(a, a)] -> String 26f (SinglePair x) = show x 27 28pattern Q = D 29 30pattern C :: a -> X Maybe (Maybe a) 31pattern C x = Y (Just x) 32 33 34pattern Syn :: forall a b c . () => () => Int 35 36pattern C :: (Show (a, Bool)) => a -> X Maybe (Maybe (a, Bool)) 37pattern C x = Y (Just (x, True)) 38 39pattern P :: T Bool b 40pattern P <- MkT True 41 42pattern D :: a -> T (Maybe a) Bool 43pattern D x = MkT (Just x) 44 45 46pattern P a b = Just (a, b) 47 48pattern Single x = [x] 49 50pattern a :+: b = (a, b) 51 52 53pattern P x <- MkT 42 x 54 55 56pattern P x y <- MkT x y 57 58pattern P x <- MkT (f -> True) x 59 60data T where 61 MkT :: b -> (b -> Bool) -> T 62 63pattern P x f <- MkT x f 64 65pattern Single x <- [x] 66 67pattern P <- Just True 68 69pattern P = 42 70 71 72pattern P = () 73 74 75pattern Single x <- [x] 76 77