diff options
Diffstat (limited to 'testsuite/tests/deriving/should_compile/drv-functor1.hs')
-rw-r--r-- | testsuite/tests/deriving/should_compile/drv-functor1.hs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/testsuite/tests/deriving/should_compile/drv-functor1.hs b/testsuite/tests/deriving/should_compile/drv-functor1.hs new file mode 100644 index 0000000000..8249858cae --- /dev/null +++ b/testsuite/tests/deriving/should_compile/drv-functor1.hs @@ -0,0 +1,65 @@ +{-# LANGUAGE DeriveFunctor #-} +{-# LANGUAGE ExistentialQuantification #-} +{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE DatatypeContexts #-} + +module ShouldCompile where + +data Trivial a = Trivial + deriving (Functor) + +data Fun a = Fun (Int -> a) + deriving (Functor) + +-- lots of different things +data Strange a b c + = T1 a b c + | T2 [a] [b] [c] -- lists + | T3 [[a]] [[b]] [[c]] -- nested lists + | T4 (c,(b,b),(c,c)) -- tuples + | T5 ([c],Strange a b c) -- tycons + | T6 (Int -> c) -- function types + | T7 (a -> (c,a)) -- functions and tuples + | T8 ((c -> a) -> a) -- continuation + deriving (Functor) + +data NotPrimitivelyRecursive a + = S1 (NotPrimitivelyRecursive (a,a)) + | S2 a + deriving (Functor,Eq) + +data Eq a => StupidConstraint a b = Stupid a b + deriving (Functor) + +-- requires Functor constraint on f and g +data Compose f g a = Compose (f (g a)) + deriving (Functor) + +-- We can't derive Functor for the following type. +-- it needs both (Functor (f Int)) and (Functor (f Bool)) +-- i.e.: +-- instance (Functor (f Bool), Functor (f Int)) => Functor (ComplexConstraint f) +-- This requires FlexibleContexts and UndecidableInstances +data ComplexConstraint f a = ComplexContraint (f Int (f Bool a,a)) +-- deriving (Functor) + +data Universal a + = Universal (forall b. (b,[a])) + | Universal2 (forall f. Functor f => (f a)) + | Universal3 (forall a. a -> Int) -- reuse a + | NotReallyUniversal (forall b. a) + deriving (Functor) + +-- Ghc doesn't allow deriving for non-Haskell98 data constructors +data Existential b + = forall a. ExistentialList [a] + | forall f. Functor f => ExistentialFunctor (f b) + | forall b. SneakyUseSameName (b -> Bool) + -- deriving (Functor) + +-- Don't get confused by synonyms +type IntFun a = Int -> a +data IntFunD a = IntFunD (IntFun a) + deriving (Functor) + |