Skip to content

Instantly share code, notes, and snippets.

@scalolli
Created March 24, 2013 09:34
Show Gist options
  • Save scalolli/5231204 to your computer and use it in GitHub Desktop.
Save scalolli/5231204 to your computer and use it in GitHub Desktop.
Monad rules using the List Monad using James Iry's blog on Monads are Elephants http://james-iry.blogspot.in/2007/10/monads-are-elephants-part-3.html
val l = List(1,2,3)
//The Functor/Monad Connection Law: The Zeroth Law
p(l map (_*2))
p(l flatMap(x => List(x*2)))
//Flatten revisited
val identity = (x:Int) => List(x)
p(s"Flatmap: ${l.flatMap(identity)}")
p(s"Flattening: ${l.map(identity).flatten}")
// The First Monad Law: Identity flatMap undoes whatever unit does
p(s"First Monad law: ${l.flatMap(identity)}")
// Second Monad Law : Unit
val f = (x:Int) => x*x
p(s"Unit law using flatmap: ${List(2).flatMap(x=>identity(f(x)))}")
p(s"Unit law using f(x): ${List(f(2))}")
//Third law of Monads Composition
val multiplyBy2 = (x:Int) => 2*x
def unit(x:Int) = List(x)
p("m map g map f ≡ m flatMap {x => unit(g(x))} flatMap {y => unit(f(y))} " + (l.flatMap(x => unit(multiplyBy2(x))) flatMap(y => unit(multiplyBy2(y)))))
p("m map g map f ≡ m flatMap {x => unit(g(x)) flatMap {y => unit(f(y))}} " + (l.flatMap(x => unit(multiplyBy2(x)) flatMap(y => unit(multiplyBy2(y))))))
p("m map g map f ≡ m flatMap {x => unit(g(x))} map {y => f(y)} " + (l.flatMap(x => unit(multiplyBy2(x))) map (y => multiplyBy2(y))))
p("m map g map f ≡ m flatMap {x => unit(g(x)) map {y => f(y)}} " + (l.flatMap(x => unit(multiplyBy2(x)) map (y => multiplyBy2(y)))))
p("m map g map f ≡ m flatMap {x => unit(f(g(x))} " + l.flatMap(x => unit(multiplyBy2(multiplyBy2(x)))))
p(" m map g map f ≡ m map {x => f(g(x))} " + l.map(x => multiplyBy2(multiplyBy2(x))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment