CopyMonad

This commit is contained in:
AF 2023-03-12 08:14:29 +00:00
parent ce63e3a1dd
commit d3ec497ec4

View File

@ -89,59 +89,59 @@ impl<T: ApplicativeLA2> CopyApplicativeLA2 for T {
}
}
// pub trait CopyApplicative: CopyFunctor + CopyApplicativeSeq + CopyApplicativeLA2 {
// fn copy_pure<A: Copy>(a: A) -> Self::CF<A>;
pub trait CopyApplicative: CopyFunctor + CopyApplicativeSeq + CopyApplicativeLA2 {
fn copy_pure<'a, A: 'a + Copy>(a: A) -> Self::CF<'a, A>;
// fn copy_discard_first<A: Copy, B: Copy>(fa: Self::CF<A>, fb: Self::CF<B>) -> Self::CF<B> {
// Self::copy_seq(Self::copy_replace(fa, |b| b), fb)
// }
fn copy_discard_first<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, B> {
Self::copy_seq(Self::copy_replace(fa, |b| b), fb)
}
// fn copy_discard_second<A: Copy, B: Copy>(fa: Self::CF<A>, fb: Self::CF<B>) -> Self::CF<A> {
// Self::copy_la2(|a, _| a, fa, fb)
// }
// }
fn copy_discard_second<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, A> {
Self::copy_la2(|a, _| a, fa, fb)
}
}
// impl<T: Applicative> CopyApplicative for T {
// fn copy_pure<A: Copy>(a: A) -> Self::CF<A> {
// Self::pure(a)
// }
impl<T: Applicative> CopyApplicative for T {
fn copy_pure<'a, A: 'a + Copy>(a: A) -> Self::CF<'a, A> {
Self::pure(a)
}
// fn copy_discard_first<A: Copy, B: Copy>(fa: Self::CF<A>, fb: Self::CF<B>) -> Self::CF<B> {
// Self::discard_first(fa, fb)
// }
fn copy_discard_first<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, B> {
Self::discard_first(fa, fb)
}
// fn copy_discard_second<A: Copy, B: Copy>(fa: Self::CF<A>, fb: Self::CF<B>) -> Self::CF<A> {
// Self::discard_second(fa, fb)
// }
// }
fn copy_discard_second<'a, A: 'a + Copy, B: 'a + Copy>(fa: Self::CF<'a, A>, fb: Self::CF<'a, B>) -> Self::CF<'a, A> {
Self::discard_second(fa, fb)
}
}
// pub trait CopyMonad: CopyApplicative {
// fn copy_bind<A: Copy, B: Copy, F: Copy + Fn(A) -> Self::CF<B>>(
// fa: Self::CF<A>,
// f: F,
// ) -> Self::CF<B>;
pub trait CopyMonad: CopyApplicative {
fn copy_bind<'a, A: 'a + Copy, B: 'a + Copy, F: 'a + Copy + Fn(A) -> Self::CF<'a, B>>(
fa: Self::CF<'a, A>,
f: F,
) -> Self::CF<'a, B>;
// fn copy_join<A: Copy>(ffa: Self::CF<Self::CF<A>>) -> Self::CF<A>
// where
// Self::CF<A>: Copy,
// {
// // ugly
// Self::copy_bind(ffa, |fa| fa)
// }
// }
fn copy_join<'a, A: 'a + Copy>(ffa: Self::CF<'a, Self::CF<'a, A>>) -> Self::CF<'a, A>
where
Self::CF<'a, A>: 'a + Copy,
{
// ugly
Self::copy_bind(ffa, |fa| fa)
}
}
// impl<T: Monad> CopyMonad for T {
// fn copy_bind<A: Copy, B: Copy, F: Copy + Fn(A) -> Self::CF<B>>(
// fa: Self::CF<A>,
// f: F,
// ) -> Self::CF<B> {
// T::bind(fa, f)
// }
impl<T: Monad> CopyMonad for T {
fn copy_bind<'a, A: 'a + Copy, B: 'a + Copy, F: 'a + Copy + Fn(A) -> Self::CF<'a, B>>(
fa: Self::CF<'a, A>,
f: F,
) -> Self::CF<'a, B> {
T::bind(fa, f)
}
// fn copy_join<A: Copy>(ffa: Self::CF<Self::CF<A>>) -> Self::CF<A>
// where
// Self::CF<A>: Copy,
// {
// T::join(ffa)
// }
// }
fn copy_join<'a, A: 'a + Copy>(ffa: Self::CF<'a, Self::CF<'a, A>>) -> Self::CF<'a, A>
where
Self::CF<'a, A>: 'a + Copy,
{
T::join(ffa)
}
}