Advertisement
Guest User

Untitled

a guest
Mar 28th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. trait MonadOnce<T>: MonadMut<T> {
  2. fn bind<F, U: Default>(self, F) -> U
  3. where F: FnOnce(T) -> U;
  4. }
  5.  
  6. trait MonadMut<T>: Monad<T> {
  7. fn bind<F, U: Default>(self, F) -> U
  8. where F: FnMut(T) -> U;
  9. }
  10.  
  11. trait Monad<T> {
  12. fn bind<F, U: Default>(self, F) -> U
  13. where F: Fn(T) -> U;
  14. }
  15.  
  16. mod impls {
  17. use super::{Monad, MonadMut, MonadOnce};
  18.  
  19. impl<T, N: MonadOnce<T>> MonadMut<T> for N {
  20. fn bind<F, U: Default>(self, f: F) -> U
  21. where F: FnMut(T) -> U {
  22. MonadOnce::bind(self, f)
  23. }
  24. }
  25.  
  26. impl<T, N: MonadMut<T>> Monad<T> for N {
  27. fn bind<F, U: Default>(self, f: F) -> U
  28. where F: Fn(T) -> U {
  29. MonadMut::bind(self, f)
  30. }
  31. }
  32. }
  33.  
  34. impl<T> MonadOnce<T> for Option<T> {
  35. fn bind<F, U: Default>(self, f: F) -> U
  36. where F: FnOnce(T) -> U {
  37. if let Some(value) = self {
  38. f(value)
  39. } else {
  40. U::default()
  41. }
  42. }
  43. }
  44.  
  45. fn main() {
  46. let foo = Some(2);
  47. println!("{:?}", Monad::bind(foo, |i| i + 1));
  48.  
  49. let bar:Option<i32> = None;
  50. println!("{:?}", Monad::bind(bar, |i| i + 1));
  51.  
  52. println!("{:?}", Monad::bind(bar, |i| Some(i + 1)));
  53.  
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement