Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- trait MonadOnce<T>: MonadMut<T> {
- fn bind<F, U: Default>(self, F) -> U
- where F: FnOnce(T) -> U;
- }
- trait MonadMut<T>: Monad<T> {
- fn bind<F, U: Default>(self, F) -> U
- where F: FnMut(T) -> U;
- }
- trait Monad<T> {
- fn bind<F, U: Default>(self, F) -> U
- where F: Fn(T) -> U;
- }
- mod impls {
- use super::{Monad, MonadMut, MonadOnce};
- impl<T, N: MonadOnce<T>> MonadMut<T> for N {
- fn bind<F, U: Default>(self, f: F) -> U
- where F: FnMut(T) -> U {
- MonadOnce::bind(self, f)
- }
- }
- impl<T, N: MonadMut<T>> Monad<T> for N {
- fn bind<F, U: Default>(self, f: F) -> U
- where F: Fn(T) -> U {
- MonadMut::bind(self, f)
- }
- }
- }
- impl<T> MonadOnce<T> for Option<T> {
- fn bind<F, U: Default>(self, f: F) -> U
- where F: FnOnce(T) -> U {
- if let Some(value) = self {
- f(value)
- } else {
- U::default()
- }
- }
- }
- fn main() {
- let foo = Some(2);
- println!("{:?}", Monad::bind(foo, |i| i + 1));
- let bar:Option<i32> = None;
- println!("{:?}", Monad::bind(bar, |i| i + 1));
- println!("{:?}", Monad::bind(bar, |i| Some(i + 1)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement