Trait fmap::NestedMonad

source ·
pub trait NestedMonad<'a, A>where
    Self: Monad<'a, <Self::InnerMonad as Functor<'a, A>>::Inner> + Functor<'a, <Self::InnerMonad as Functor<'a, A>>::Inner, Inner = A, Mapped = A>,
    A: 'a,{
    type InnerMonad: Functor<'a, A>;

    // Provided method
    fn mjoin(self) -> A { ... }
}
Expand description

Nested monad that can be joined

This trait is automatically implemented for nested monads with type parameter A being the inner monad.

Examples

use fmap::NestedMonad;

fn my_mjoin<'a, M: NestedMonad<'a, A>, A>(m: M) -> A
where
    M: NestedMonad<'a, A>,
    A: 'a,
{
    m.bind(|x| x)
}

let nested = vec![vec![1, 3], vec![2, 9, 9]];
assert_eq!(my_mjoin(nested.clone()), vec![1, 3, 2, 9, 9]);
assert_eq!(nested.mjoin(), vec![1, 3, 2, 9, 9]);

Required Associated Types§

source

type InnerMonad: Functor<'a, A>

Helper type always equal to A

This type is needed to circumvent Rust issue #20671.

Provided Methods§

source

fn mjoin(self) -> A

Generic join

.mjoin() is equivalent to .bind(|x| x).

Implementors§

source§

impl<'a, T, A> NestedMonad<'a, A> for Twhere T: Monad<'a, <A as Functor<'a, A>>::Inner> + Functor<'a, <A as Functor<'a, A>>::Inner, Inner = A, Mapped = A>, A: Functor<'a, A> + 'a,

§

type InnerMonad = A