summaryrefslogtreecommitdiff
path: root/assignment-4/monad.dcl
diff options
context:
space:
mode:
Diffstat (limited to 'assignment-4/monad.dcl')
-rw-r--r--assignment-4/monad.dcl35
1 files changed, 35 insertions, 0 deletions
diff --git a/assignment-4/monad.dcl b/assignment-4/monad.dcl
new file mode 100644
index 0000000..6b0b2b5
--- /dev/null
+++ b/assignment-4/monad.dcl
@@ -0,0 +1,35 @@
+definition module monad
+
+/*
+ Pieter Koopman, pieter@cs.ru.nl
+ Advanced Programming, week 4
+*/
+
+import StdMisc
+
+class Functor f where
+ fmap :: (a->b) (f a) -> (f b)
+ (<$>) infixl 4 :: (a->b) (f a) -> (f b) | Functor f
+ (<$>) f x :== fmap f x
+
+class Applicative f | Functor f where
+ pure :: a -> f a
+ (<*>) infixl 4 :: (f (a->b)) (f a) -> f b
+
+class Monad m | Applicative m where
+ bind :: (m a) (a->m b) -> m b
+ (>>=) infixl 1 :: (m a) (a->m b) -> m b | Monad m
+ (>>=) a f :== bind a f
+ (>>|) infixl 1 :: (m a) (m b) -> m b | Monad m
+ (>>|) a b :== a >>= \_.b
+ rtrn :: a -> m a | Monad m
+ rtrn a :== pure a
+
+class fail m | Applicative m where
+ fail :: m a
+ guard :: Bool -> m a | fail m
+ guard b :== if b (pure undef) fail
+
+class OrMonad m where
+ (<|>) infixl 0 :: (m a) (m a) -> m a
+