summaryrefslogtreecommitdiff
path: root/functor/h4.hs
diff options
context:
space:
mode:
Diffstat (limited to 'functor/h4.hs')
-rw-r--r--functor/h4.hs21
1 files changed, 21 insertions, 0 deletions
diff --git a/functor/h4.hs b/functor/h4.hs
new file mode 100644
index 0000000..2e00031
--- /dev/null
+++ b/functor/h4.hs
@@ -0,0 +1,21 @@
+-- Haskell only has covariant functors of the following form:
+-- class Functor f where
+-- fmap:: (a->b) -> f a -> f b
+-- Contra/Co-variant :
+-- http://www.reddit.com/r/haskell/comments/1cht4v/what_does_coalgebra_mean_in_the_context_of/c9gzulr
+
+class Contravariant f where
+ contramap :: (a->b) -> f b -> f a
+
+data Cont a = Cont (a -> Int)
+
+instance Contravariant Cont where
+ contramap f (Cont x) = Cont (x.f)
+
+-- The following however is covariant
+data H t = H1 t | H2 ((t -> Int) -> Int)
+
+instance Functor H where
+ fmap f (H1 x) = H1 (f x)
+ fmap f (H2 g) = H2 (\h -> g (h . f))
+