derivations::bind

This commit is contained in:
AF 2023-05-07 18:21:57 +00:00
parent 5d1349cd80
commit 629a0c9c83
2 changed files with 9 additions and 0 deletions

View File

@ -166,6 +166,8 @@ pub trait Applicative: Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple
/// <https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Monad.html> /// <https://hackage.haskell.org/package/base-4.18.0.0/docs/Control-Monad.html>
pub trait Monad: Applicative { pub trait Monad: Applicative {
/// Equivalent of Haskell's `>==`. /// Equivalent of Haskell's `>==`.
/// Due to Rust limitations, it's not a `function->function` conversion.
/// For that see [`derivations::bind`].
fn bind<'a, A: 'a, B: 'a>( fn bind<'a, A: 'a, B: 'a>(
fa: Self::F<'a, A>, fa: Self::F<'a, A>,
f: impl 'a + FnOnce(A) -> Self::F<'a, B>, f: impl 'a + FnOnce(A) -> Self::F<'a, B>,

View File

@ -9,6 +9,13 @@ pub fn fmap<'a, T: 'a + Functor, A: 'a, B: 'a>(
move |fa| T::fmap(f, fa) move |fa| T::fmap(f, fa)
} }
/// Equivalent of Haskell's `fmap`. `function-function` equivalent of [Monad::bind].
pub fn bind<'a, T: 'a + Monad, A: 'a, B: 'a>(
f: impl 'a + FnOnce(A) -> T::F<'a, B>,
) -> impl FnOnce(T::F<'a, A>) -> T::F<'a, B> {
move |fa| T::bind(fa, f)
}
pub trait ApplicativeLA2ViaSeq: ApplicativeSeq { pub trait ApplicativeLA2ViaSeq: ApplicativeSeq {
fn _la2_via_seq<'a, A: 'a, B: 'a, C: 'a>( fn _la2_via_seq<'a, A: 'a, B: 'a, C: 'a>(
f: impl 'a + FnOnce(A, B) -> C, f: impl 'a + FnOnce(A, B) -> C,