Complete work on new OVERLAPPABLE/OVERLAPPING pragmas (Trac #9242)
[ghc.git] / testsuite / tests / ghci / scripts / ghci047.script
1 --Testing GADTs, type families as well as a ton of crazy type stuff
2 :set -XGADTs
3 :set -XTypeFamilies
4 :set -XFunctionalDependencies
5 :set -XFlexibleContexts
6 :set -XFlexibleInstances
7 :set -XUndecidableInstances
8 data A
9 data B
10 data C
11 :{
12 data ABorC t where
13   Foo :: Int -> ABorC A
14   Bar :: Bool -> ABorC A
15   Baz :: Char -> ABorC B
16   Quz :: ABorC B
17   Yud :: String -> ABorC C
18   Myp :: Double -> ABorC C
19 :}
20 data HTrue
21 data HFalse
22
23 class TypeEq x y b | x y -> b
24 instance {-# OVERLAPS #-} (HTrue ~ b)  => TypeEq x x b
25 instance {-# OVERLAPS #-} (HTrue ~ b)  => TypeEq x x b
26 instance {-# OVERLAPS #-} (HFalse ~ b) => TypeEq x y b
27
28 type family Or a b
29 type instance Or HTrue  HTrue  = HTrue
30 type instance Or HTrue  HFalse = HTrue
31 type instance Or HFalse HTrue  = HTrue
32 type instance Or HFalse HFalse = HFalse
33
34 let f :: (Or a c ~ HTrue, TypeEq t A a, TypeEq t C c) => ABorC t -> Int ;    f x = 1
35 f $ Foo 1
36 f $ Bar True
37 f $ Baz 'a'
38 f $ Quz
39 f $ Yud "a"
40 f $ Myp 4.3