Trait radn::func::Monad

source ·
pub trait Monad<'a>: Applicative<'a> {
    // Required methods
    fn bind<A: 'a + Send, B: 'a + Send>(
        fa: Self::F<A>,
        f: impl 'a + Send + FnOnce(A) -> Self::F<B>
    ) -> Self::F<B>;
    fn iterate<B: 'a + Send>(
        f: impl Iterative<'a, T = Self, B = B>
    ) -> Self::F<B>;

    // Provided method
    fn join<A: 'a + Send>(ffa: Self::F<Self::F<A>>) -> Self::F<A> { ... }
}
Expand description

Required Methods§

source

fn bind<A: 'a + Send, B: 'a + Send>( fa: Self::F<A>, f: impl 'a + Send + FnOnce(A) -> Self::F<B> ) -> Self::F<B>

Equivalent of Haskell’s >==. Due to Rust limitations, it’s not a function->function conversion. For that see derivations::bind.

source

fn iterate<B: 'a + Send>(f: impl Iterative<'a, T = Self, B = B>) -> Self::F<B>

Included for optimisation and clarity. Generally, Monad::bind should be enough implement it. See StacklessInstance::iterate for a generic, though less-than ideal, blanket implementation. On practice, you generally shouldn’t be using Monad::bind/Pure::pure/Functor::fmap here.

Provided Methods§

source

fn join<A: 'a + Send>(ffa: Self::F<Self::F<A>>) -> Self::F<A>

Equivalent of Haskell’s join.

Implementors§

source§

impl<'a> Monad<'a> for FutureInstance

source§

impl<'a> Monad<'a> for LazyInstance

source§

impl<'a> Monad<'a> for OptionInstance

source§

impl<'a> Monad<'a> for SoloInstance

source§

impl<'a> Monad<'a> for StacklessInstance

source§

impl<'a, E: 'a + Send> Monad<'a> for ResultInstance<E>

source§

impl<'a, E: 'a + Send> Monad<'a> for TryFutureInstance<E>

source§

impl<'a, E: 'a + Effect> Monad<'a> for EffectInstance<E>

source§

impl<'a, T: Monad<'a>, O: 'a + DeriveMonad> Monad<'a> for OverloadInstance<T, O>

source§

impl<'a, U: Monad<'a>, V: Monad<'a> + LocalFunctor<'a>> Monad<'a> for CompositionInstance<U, V>