From 592dd55a70bcf3a159c32f07c698b3cc39b0d02a Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 2 Oct 2017 20:13:38 +0200 Subject: Cleanup bootstrap --- assignment-4/monad.dcl | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 assignment-4/monad.dcl (limited to 'assignment-4/monad.dcl') 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 + -- cgit v1.2.3