summaryrefslogtreecommitdiff
path: root/testsuite/tests/deriving/should_run/drvrun-functor1.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/deriving/should_run/drvrun-functor1.hs')
-rw-r--r--testsuite/tests/deriving/should_run/drvrun-functor1.hs49
1 files changed, 49 insertions, 0 deletions
diff --git a/testsuite/tests/deriving/should_run/drvrun-functor1.hs b/testsuite/tests/deriving/should_run/drvrun-functor1.hs
new file mode 100644
index 0000000000..1367e360e0
--- /dev/null
+++ b/testsuite/tests/deriving/should_run/drvrun-functor1.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE DeriveFunctor #-}
+
+module Main where
+
+-- Derive functor for a simple data type
+
+data List a = Nil | Cons a (List a)
+ deriving (Functor,Show)
+
+someList = Cons 1 (Cons 1 (Cons 2 (Cons 3 Nil)))
+doubleList = fmap (*2) someList
+
+test1 = do
+ putStr "normal: " >> print someList
+ putStr "double: " >> print doubleList
+
+-- Derive functor for a data type with functions and tuples
+
+data ReaderWriter r w a = RW { runRW :: r -> (a,w) }
+ deriving (Functor)
+
+data Cont r a = Cont { runCont :: (a -> r) -> r }
+ deriving (Functor)
+
+test2 = do
+ let rw = RW (\r -> ("something",r*3))
+ putStr "normal: " >> print (runRW rw 123)
+ putStr "reverse: " >> print (runRW (fmap reverse rw) 456)
+ let five = Cont ($ 5)
+ putStr "normal: " >> runCont five print
+ putStr "double: " >> runCont (fmap (*2) five) print
+
+-- Derive functor in such a way that we need a constraint
+
+newtype Compose f g a = Compose (f (g a))
+ deriving (Functor,Show)
+
+listOfLists = Compose [[1,2,3],[7,8,9]]
+
+test3 = do
+ putStr "normal: " >> print listOfLists
+ putStr "double: " >> print (fmap (*2) listOfLists)
+
+-- All tests
+
+main = do
+ test1
+ test2
+ test3