summaryrefslogtreecommitdiff
path: root/assignment-4/monad.dcl
blob: 6b0b2b5c0dfe0bfef14d15844c64eda26b56ad93 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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