From 629a0c9c83fffb60ef7cfe9de6079d22ab8771dc Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 7 May 2023 18:21:57 +0000 Subject: [PATCH] `derivations::bind` --- src/func.rs | 2 ++ src/func/derivations.rs | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/func.rs b/src/func.rs index 23c6385..9b09ec6 100644 --- a/src/func.rs +++ b/src/func.rs @@ -166,6 +166,8 @@ pub trait Applicative: Pure + ApplicativeSeq + ApplicativeLA2 + ApplicativeTuple /// pub trait Monad: Applicative { /// 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>( fa: Self::F<'a, A>, f: impl 'a + FnOnce(A) -> Self::F<'a, B>, diff --git a/src/func/derivations.rs b/src/func/derivations.rs index 37e6dce..9fd169d 100644 --- a/src/func/derivations.rs +++ b/src/func/derivations.rs @@ -9,6 +9,13 @@ pub fn fmap<'a, T: 'a + Functor, A: 'a, B: 'a>( 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 { fn _la2_via_seq<'a, A: 'a, B: 'a, C: 'a>( f: impl 'a + FnOnce(A, B) -> C,