diff --git a/src/func/test_suite.rs b/src/func/test_suite.rs index e1a53eb..5ec0f3a 100644 --- a/src/func/test_suite.rs +++ b/src/func/test_suite.rs @@ -83,5 +83,10 @@ pub fn monad_follows_laws<'a, T: Monad<'a> + FunctorTestSuite<'a>>() -> R { T::sample(|pa| { res += fmap_can_be_expressed_via_bind::(|x| x + 3, || pa(2)); }); + T::sample(|pa| { + T::sample(|pb| { + res += join_can_be_expressed_via_bind::(|| pa(pb(2))); + }) + }); res } diff --git a/src/func/tests.rs b/src/func/tests.rs index 031d179..918625c 100644 --- a/src/func/tests.rs +++ b/src/func/tests.rs @@ -347,3 +347,17 @@ pub fn tuple_can_be_expressed_via_la2< T::la2(fa0(), fb0(), |a, b| (a, b)), ) } + +pub fn join_can_be_expressed_via_bind< + 'a, + T: Monad<'a> + Eqr<'a>, + A: 'a + Send + Debug + PartialEq, +>( + ffa0: impl Fn() -> T::F>, +) -> R { + T::eqr( + "join via bind: join x = x >>= id", + T::join(ffa0()), + T::bind(ffa0(), |fa| fa), + ) +}