packages feed

idris-0.9.0: lib/prelude/monad.idr

module prelude.monad

-- Monads and Functors

import builtins

%access public

infixl 5 >>=

class Monad (m : Set -> Set) where 
    return : a -> m a
    (>>=)  : m a -> (a -> m b) -> m b

class Functor (f : Set -> Set) where 
    fmap : (a -> b) -> f a -> f b

class Monad m => MonadPlus (m : Set -> Set) where 
    mplus : m a -> m a -> m a
    mzero : m a

guard : MonadPlus m => Bool -> m ()
guard True  = return ()
guard False = mzero

when : Monad m => Bool -> m () -> m ()
when True  f = f
when False _ = return ()

sequence : Monad m => List (m a) -> m (List a)
sequence []        = return []
sequence (x :: xs) = [ x' :: xs' | x' <- x, xs' <- sequence xs ]

sequence_ : Monad m => List (m a) -> m ()
sequence_ [] = return ()
sequence_ (x :: xs) = do x; sequence_ xs

mapM : Monad m => (a -> m b) -> List a -> m (List b)
mapM f xs = sequence (map f xs)

mapM_ : Monad m => (a -> m b) -> List a -> m ()
mapM_ f xs = sequence_ (map f xs)