Your SlideShare is downloading. ×
0
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Introduction to Monads in Scala (1)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Introduction to Monads in Scala (1)

8,504

Published on

Published in: Technology, Business
0 Comments
22 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,504
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
119
Comments
0
Likes
22
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • imperative
  • Transcript

    • 1. Monads Part 1functional programming with scala
    • 2. Where r the verbs lost?
    • 3. Thinking in Use Cases get the coffee meet with colleagues on the kitchen read emails review social media update the workspace write the code
    • 4. Thinking in JavaCompanyHolder.getStuffFactoryBuilder(). buildCurrentState(). find(Rooms.KITCHEN, CoffeMachine.Any). get(0). run(new CoffeeJob( me.getHabitsStore().find("coffe"). mapToJobMachnie(), null));
    • 5. Thinking in JavaNeed an update:new SVNUpdateJob(myProject).go();• execute• process• run• start• doIt
    • 6. Thinking in JavaCheck GmailMySmartProxyHack.go();go via Hack or Job – action name isnt important
    • 7. QHow many times u were not lucky withfact that do is the keyword?ProjectManager.do() vs manageSecurityProcessor.do() vs process
    • 8. Guava from GBad library: it makes me feeling smellPreconditions.checkArgument(...) vscheckArgument(...)withstatic import... but this is a way for nonlazy dudes in Java
    • 9. Patriots in JavaFirst action is create, get, find, build, ...?Use a Spring, Guice!!!
    • 10. Other ways of thinkingC and C++Python
    • 11. Evil?We r smart – look into Python,Ruby, Java Script or Perl – gun meat.Im smart enough to understandAbstractProxyMediator orNotificationStrategyFactory– they even dont have it!
    • 12. Monad is …
    • 13. Monad isUsually articles that start with words like"monad" and "functor" quickly devolve intosoup of Greek letters. Thats because both areabstract concepts in a branch of mathematicscalled category theory and explaining themcompletely is a mathematical exercise. JAMES IRY
    • 14. Stateless paradigm
    • 15. JEE Session Facade stack trace
    • 16. Functions …F1(F2(F3(F4(Xinput))))
    • 17. Jump to ScalaFew syntax details to understand examples
    • 18. val, Listval act1 = List ("Leonardo" , "Raphael")
    • 19. List operations, Nilval act2 = “April” :: "Donatello" :: Nilval act3 = act1 ::: act2
    • 20. Var, no sugarvar act4:List[String] = act3act4 = "Michelangelo" :: act4
    • 21. Function(x: Int) => x * 2
    • 22. Function as valueval double = (x: Int) => x * 2double(10)
    • 23. SugarList(1,2,3).foreach ( (x:Int) => println ( x ) )List(1,2,3).foreach ( x => println ( x ) )List(1,2,3).foreach ( println _ )List(1,2,3).foreach ( println )
    • 24. Yieldval result = for (i <- 1 to 5) yield iVector(1, 2, 3, 4, 5)
    • 25. Traittrait Manager extends Lead{ private var workSchedule:Schedule = … override def schedule = workSchedule}class College extends Worker with Manager withWellpaid with HardToFind
    • 26. 1. Monads are Container Types Option, List, …
    • 27. Where is my manager?Company company = getCompany();Manager manager = company.findManager();if (manager != null) { manager.getBonusFor(me);} else { System.out.println("As always...");}
    • 28. Schrödingers Statepublic interface Option<T> { public T value(); public boolean hasValue();}Company company = getCompany();Option<Manager> manager = company.findManager();if (manager.hasValue()) { manager.getBonusFor(me);} else { System.out.println(”Arent news!");}
    • 29. Optiontrait Manager { def getBonusFor(id: Long) :Option[Double]}trait Company { def manager:Manager}val sum = getCompany().manager. getBonusFor(myId)val bonus = sum match { case Some(bonus) => bonus case None => 0}
    • 30. 0 on defaultval myBonus = manager.getOrElse(0)
    • 31. 0 on defaultval myBonus = manager.getOrElse(0)
    • 32. If in IfCompany company = getCompany(); if (company != null) { Manager manager = company.findManager(); if (manager != null) { double bonus = manager.getBonusFor(me); ... } else { System.out.println("Isnt news!"); } }
    • 33. Or Elseval m =company.getManager.getOrElse(ManagmentFactory.newOne)m.getBonusFor(me).getOrElse(…)
    • 34. Option is a monadfor ( c <- getCompany; m <- c.getManagerFor(me); b <- m.getBonusFor(me)) b spend
    • 35. 2. Monads Support Higher Order Functionsval list = List(1, 2, 3)def neg (elem: Int) = -elemval mapResult = list map negList(1,2,3) map {-_}
    • 36. Doesn’t change the kind of monad, butmay change its parameterized type...val one = Some(1)val oneString = one map {_.toString}assert (oneString == Some("1"))
    • 37. 3. Monads are Combinableval opMan : Option[Manager] = companygetManagerdef extractBonus(m:Manager) : Option[Double]= ...val result = opMan map extractBonusOption[Option[Double]]
    • 38. List[List[Int]]]List[List[List[Int]]]]
    • 39. Flattendef flatten[A](outer:Option[Option[A]]) : Option[A] = outer match { case None => None case Some(inner) => inner }If the outer option is None, then result is None.Otherwise the result is the inner Option.
    • 40. Join, Flatten etcScala does not require you to write flatten explicitly.But it does require that each monad have a methodcalled flatMap.class M[A] { private def flatten[B](x:M[M[B]]) : M[B] = ... def map[B](f: A => B) : M[B] = ... def flatMap[B](f: A => M[B]) : M[B] = flatten(map(f))}
    • 41. Reviewval opMan : Option[Manager] = companygetManagerdef extractBonus(m:Manager) : Option[Double]= ...val result = opMan flatMap extractBonusOption[Double]
    • 42. 4. Monads Can Be Built In Different Ways ”unit,” in Haskell its called “return”single argument “constructor” or ”actory” A become a monad of type M[A] For List: unit(x) == List(x) For Option: unit(x) == Some(x)
    • 43. class M[A](value: A) { private def unit[B] (value : B) = new M(value) …}
    • 44. Map based on flatMapScala does not require a separate "unit" function ormethodclass M[A](value: A) { private def unit[B] (value : B) = new M(value) def map[B](f: A => B) : M[B] = flatMap {x => unit(f(x))} def flatMap[B](f: A => M[B]) : M[B] = ...}
    • 45. Basis 1Generic Haskell ScalaM data M a class M[A] or newtype M a or case class M[A] or instance Monad (M a) or trait M[A]Ma Ma M[A]unit v return v new M(v) or M(v)map f m fmap f m m map fbind f m m >>= f m flatMap f or f =<< mjoin join flatten do for

    ×