Bohtvaroh

Blogger - Scalaz Motivation - 16

Jun 1st, 2012
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.87 KB | None | 0 0
  1. object ScalazMotivation extends App {
  2.   def p(a: Any) { println("###> " + a) }
  3.  
  4.   trait Monoid[A] {
  5.     def mzero: A
  6.     def mappend(a1: A, a2: A): A
  7.   }
  8.  
  9.   object Monoid {
  10.     implicit object IntMonoid extends Monoid[Int] {
  11.       def mzero = 0
  12.       def mappend(a: Int, b: Int) = a + b
  13.     }
  14.  
  15.     implicit object StringMonoid extends Monoid[String] {
  16.       def mzero = ""
  17.       def mappend(a1: String, a2: String) = a1 + a2
  18.     }
  19.   }
  20.  
  21.   trait FoldLeft[M[_]] {
  22.     def foldLeft[A, B](ma: M[A], b: B, op: (B, A) => B): B
  23.   }
  24.  
  25.   object FoldLeft {
  26.     implicit object ListFoldLeft extends FoldLeft[List] {
  27.       def foldLeft[A, B](ma: List[A], b: B, op: (B, A) => B) = ma.foldLeft(b)(op)
  28.     }
  29.  
  30.     implicit object TreeFoldLeft extends FoldLeft[Tree] {
  31.       def foldLeft[A, B](ma: Tree[A], b: B, op: (B, A) => B) = {
  32.         def toList(ma: Tree[A]): List[A] = ma match {
  33.           case Node(el, left, right) => toList(left) ::: (el :: toList(right))
  34.           case Empty() => Nil
  35.         }
  36.         toList(ma).foldLeft(b)(op)
  37.       }
  38.     }
  39.   }
  40.  
  41.   sealed trait Tree[E]
  42.   case class Empty[E]() extends Tree[E]
  43.   case class Node[E](el: E, left: Tree[E], right: Tree[E]) extends Tree[E]
  44.  
  45.   def sum[M[_], T](xs: M[T])(implicit m: Monoid[T], fl: FoldLeft[M]): T =
  46.     fl.foldLeft(xs, m.mzero, m.mappend)
  47.  
  48.   val tree: Tree[String] =
  49.     Node("c",
  50.       Node("b",
  51.         Node("a", Empty(), Empty()),
  52.         Node("a",
  53.           Node("r", Empty(), Empty()),
  54.           Empty()
  55.         )
  56.       ),
  57.       Node("d",
  58.         Node("a", Empty(), Empty()),
  59.         Node("b",
  60.           Node("a", Empty(), Empty()),
  61.           Node("r",
  62.             Empty(),
  63.             Node("a", Empty(), Empty())
  64.           )
  65.         )
  66.       )
  67.     )
  68.  
  69.   p(sum(List(1, 2, 3))) // prints ###> 6
  70.   p(sum(List("lamb", "da"))) // prints ###> lambda
  71.   p(sum(tree)) // prints ###> abracadabra
  72. }
Advertisement
Add Comment
Please, Sign In to add comment