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