1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
use applicative::Applicative;
use bind::Bind;
use std::rc::Rc;

pub trait Monad<A, B>: Bind<B> + Applicative<A, B> {}

impl<A, B> Monad<A, B> for Rc<A> {}
impl<A, B> Monad<A, B> for Box<A> {}

impl<A, B> Monad<A, B> for Option<A> {}
impl<A, B, E: Clone> Monad<A, B> for Result<A, E> {}
impl<A, B> Monad<A, B> for Vec<A> {}