Advertisement
Guest User

Untitled

a guest
Aug 30th, 2014
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.40 KB | None | 0 0
  1. sealed trait MyList[+A] {
  2.   def flatMap[B](f: A => MyList[B]): MyList[B] = this match {
  3.     case MyNil => MyNil
  4.     case MyCons(head, tail) => f(head).append(tail.flatMap(f))
  5.   }
  6.  
  7.   def append[AA >: A](other: MyList[AA]): MyList[AA] = this match {
  8.     case MyNil => other
  9.     case MyCons(head, tail) => MyCons(head, tail.append(other))
  10.   }
  11.  
  12.   override def toString: String =
  13.     "List(" + (this match {
  14.       case MyNil => ""
  15.       case MyCons(head, tail) => head.toString + "," + tail.toString
  16.     }) + ")"
  17. }
  18.  
  19. case object MyNil extends MyList[Nothing]
  20. case class MyCons[+A](head: A, tail: MyList[A]) extends MyList[A]
  21.  
  22. object MyList {
  23.   def pure[A](a: => A): MyList[A] = MyCons(a, MyNil)
  24. }
  25.  
  26. trait Monad[M[_]] {
  27.   def pure[A](a: => A): M[A]
  28.   def flatMap[A,B](m: => M[A])(f: A => M[B]): M[B]
  29. }
  30.  
  31. object Monad {
  32.   implicit val listMonad: Monad[List] = new Monad[List] {
  33.     def pure[A](a: => A): List[A] = List(a)
  34.     def flatMap[A,B](m: => List[A])(f: A => List[B]): List[B] =
  35.       m.flatMap(f)
  36.   }
  37.  
  38.   implicit val myListMonad: Monad[MyList] = new Monad[MyList] {
  39.     def pure[A](a: => A): MyList[A] = MyList.pure(a)
  40.     def flatMap[A,B](m: => MyList[A])(f: A => MyList[B]): MyList[B] =
  41.       m.flatMap(f)
  42.   }
  43. }
  44.  
  45. class MonadOps[M[_],A](value: M[A])(implicit m: Monad[M]) {
  46.   def flatMap[B](f: A => M[B]): M[B] =
  47.     m.flatMap(value)(f)
  48.  
  49.   def map[B](f: A => B): M[B] =
  50.     m.flatMap(value){ a => m.pure(f(a)) }
  51.  
  52.   override def toString: String = value.toString
  53. }
  54.  
  55. object MonadOps {
  56.   implicit def toMonadOps[M[_],A](value: M[A])(implicit m: Monad[M]) =
  57.     new MonadOps(value)(m)
  58. }
  59.  
  60. object Main {
  61.   def main(args: Array[String]): Unit = {
  62.     val monadOps: MonadOps[List, Int] = List(1,2,3)
  63.     val secondOps: MonadOps[List, Int] = monadOps.map { _ + 3 }
  64.     println(secondOps)
  65.  
  66.     val Monad: Monad[List] = implicitly[Monad[List]]
  67.     val list = List(1,2,3,4)
  68.     val secondList = Monad.flatMap(list){ x => List(x + 3) }
  69.     println(secondList)
  70.  
  71.     val ops: MonadOps[MyList, Int] = MyCons(3, MyCons(4, MyCons(5, MyNil)))
  72.     val secOps: MonadOps[MyList, Int] = ops.map { _ + 2 }
  73.     println(secOps)
  74.  
  75.     println(mapOverList(MyCons(1, MyCons(2, MyNil))){_ + 2})
  76.  
  77.     import MonadOps._
  78.     val l: MyList[Int] = MyCons(1, MyCons(2, MyNil))
  79.     println(l.map{_ + 2})
  80.   }
  81.  
  82.   def mapOverList[A,B](l: MyList[A])(f: A => B): MyList[B] = {
  83.     import MonadOps._
  84.     l.map(f)
  85.   }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement