Your SlideShare is downloading. ×
0
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
Slides
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

Slides

170

Published on

Introduction scalaz talk at Berlin scala user group.

Introduction scalaz talk at Berlin scala user group.

Published in: Technology, Sports
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
170
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
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

Transcript

  • 1. .................................................................................................................ScalazLearn You Yet Another Real World Gentle Haskell(LYYARWGH) ((c) sproingie)George Leon evdeltamethod GmbHApril 17, 2013(λx.folonexlambda-calcul.us)@folone.infoGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 1 / 29
  • 2. ..........................................................................................................This talkhttps://github.com/folone/scalaz-talk-berlinhttps://speakerdeck.com/folone/scalaz-talkGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 2 / 29
  • 3. ..........................................................................................................AgendaSome hotness without context, to draw a en on (Op on, Boolean,Memo)TypeclassesMonoidFunctor, Applica ve, MonadEffectsscalaz 6 vs seventypelevel.scalaGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 3 / 29
  • 4. ..........................................................................................................What is scalazPurely func onal datatypes (Fingertree, HList, DList, Trees, Zippers, Nel,ImmutableArray)TypeclassesEffectsConcurrencyGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 4 / 29
  • 5. ..........................................................................................................Examples -- typesafe equalss> "" == 5res0: Boolean = falses> "" === 5<console>:14: error: type mismatch;found : Int(5)required: java.lang.String"" === 5^<spoiler>∀ stuff ∈ scalaz ≡ scala.stdlib | stuff is typesafe ∨ stuff isstrict</spoiler>George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 5 / 29
  • 6. ..........................................................................................................Examples -- op onss> some(5) getOrElse 0res1: Int = 5s> some(5) | 0res2: Int = 5s> some(1) getOrElse "ok"res3: Any = 1s> some(1) | "ok"<console>:14: error: type mismatch;found : java.lang.String("ok")required: Intsome(1) | "ok"^s> ~some(5) // Monoidsres4: Int = 5s> ~none[Int] // NB: Beware of unary_~ on Validations (swapres5: Int = 0George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 6 / 29
  • 7. ..........................................................................................................Examples -- op ons II// Smart constructorss> :t Some(1) s> :t NoneSome[Int] None.types> :t some(1) s> :t none[Int]Option[Int] Option[Int]s> List(Some(1),None).foldLeft(None){(_, v) => v}<console>:14: error: type mismatch;found : v.type (with underlying type Option[Int])required: None.typeList(Some(1),None).foldLeft(None){(_, v) => v}^s> List(Some(1),None).foldLeft(none[Int]){(_, v) => v}res11: Option[Int] = NoneGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 7 / 29
  • 8. ..........................................................................................................Examples -- booleansscala> true ? println("true") | println("false")truescala> true ?? 5 scala> true !? 5res14: Int = 5 res15: Int = 0scala> false ?? 5 scala> false !? 5res15: Int = 0 res17: Int = 5George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 8 / 29
  • 9. ..........................................................................................................Examples -- func on composi onval a = (_:Int) + 6val b = (_:Int).toStringval c = (_:String).lengthscala> 5 |> a |> b |> cres18: Int = 2scala> //(c · b · a) apply 5 // contramapres19: Int = 2scala> 5 |> //(a ◦ b ◦ c) // mapres20: Int = 2// contramap === flip . mapGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 9 / 29
  • 10. ..........................................................................................................Examples -- Memodef func(s: String) = // Expensive computationscala> Memo.immutableHashMapMemo(func)res11: String => java.lang.String = <function1>// Different strategiesmutableHashMapMemoarrayMemo // sizedimmutableListMemoimmutableTreeMapMemodoubleArrayMemo // memoizing Double results != sentinelweakHashMapMemo // GCGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 10 / 29
  • 11. ..........................................................................................................Examples -- Trampolinedef even(n: Int): Boolean =if (n == 0) trueelse odd(n - 1)def odd(n: Int): Boolean =if (n == 0) falseelse even(n - 1)scala> even(30000)George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 11 / 29
  • 12. ..........................................................................................................Examples -- Trampolinedef even(n: Int): Trampoline[Boolean] =if (n == 0) done(true)else suspend(odd(n - 1))def odd(n: Int): Trampoline[Boolean] =if (n == 0) done(false)else suspend(even(n - 1))scala> even(30000).runGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 12 / 29
  • 13. ..........................................................................................................Examples -- Trampolinedef fibRec(n: Int): Int =if (n < 2) n else fibRec(n - 1) + fibRec(n - 2)def fibTailrec(n: Int) = {def loop(n: Int, next: Int, result: Int) = n match {case 0 => resultcase _ => loop(n - 1, next + result, next)}loop(n, 1, 0)}George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 13 / 29
  • 14. ..........................................................................................................Examples -- Trampolinedef fibTramp(n: Int): Trampoline[Int] =if (n < 2) done(n) else suspend {for {i <- fibTramp(n - 1)j <- fibTramp(n - 2)} yield i + j}// Continuation monad magicConsult @runaroramas paper "Stackless Scala with Free Monads"George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 14 / 29
  • 15. ..........................................................................................................TypeclassesGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 15 / 29
  • 16. ..........................................................................................................TypeclassesGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 16 / 29
  • 17. ..........................................................................................................Typeclasseshttp://www.haskell.org/haskellwiki/Typeclassopediahttp://typeclassopedia.bitbucket.org/George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 17 / 29
  • 18. ..........................................................................................................TypeclassesA monoid generalizes the (++) opera on.A functor generalises the map opera on.An applica ve functor generalizes the zip (or zipWith) opera on.A monad generalizes the concat opera on.http://stackoverflow.com/a/15727162/163423George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 18 / 29
  • 19. ..........................................................................................................Monoids(S, ⊗, 1)∀a, b ∈ S : a ⊗ b ∈ S∀a, b, c ∈ S : (a ⊗ b) ⊗ c = a ⊗ (b ⊗ c)∀a ∈ S : 1 ⊗ a = a ⊗ 1 = atrait Semigroup[F] {def append(a1: F, a2: F): F}trait Monoid[F] extends Semigroup[F] {def zero: F}// scalacheck-bindingimport scalaz.scalacheck.ScalazProperties._semigroup.laws[Int]monoid.laws[String]George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 19 / 29
  • 20. ..........................................................................................................Monoidsscala> 1 |+| 5res2: Int = 6scala> Multiplication(2) |+| Multiplication(3)res4: Int @@ Multiplication = 6scala> some(1) |+| some(5)res5: Option[Int] = Some(6)// Monoids beget monoidsscala> some(some((1, "OH ", 1 + (_:Int)))) |+|some(some((4, "HAI", 2 * (_:Int))))res6: Option[Option[(Int, java.lang.String,Int => Int)]] = Some(Some((5, OH HAI,<function1>)))George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 20 / 29
  • 21. ..........................................................................................................Monoidsscala> List(1,2,3).sumlres16: Int = 6scala> List("OH ", "HAI", "!").sumlres17: java.lang.String = OH HAI!George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 21 / 29
  • 22. ..........................................................................................................Functorstrait Functor[F[_]] {def fmap[A, B](f: A => B): F[A] => F[B]}scala> some(3) map(_.toString)res13: Option[java.lang.String] = Some(3)George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 22 / 29
  • 23. ..........................................................................................................Applica vestrait Applicative[T[_]] extends Functor[T] {def pure[A](a: A): T[A]def <*>[A, B](tf: T[A => B])(ta: T[A]): T[B]}scala> some(1) <*> some((_:Int) + 2) <*> some((_:Int) * 5res10: Option[Int] = Some(15)scala> List(1,2) <*> List((_:Int) * 5, (_: Int) + 2)res12: List[Int] = List(5, 10, 3, 4)George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 23 / 29
  • 24. ..........................................................................................................Applica vesscala> List(some(1), some(2), some(3))res21: List[Option[Int]] = List(Some(1), Some(2),Some(3))scala> .sequenceres22: Option[List[Int]] = Some(List(1, 2, 3))scala> res21.traverse(x => some(x)) // sequence . mapres23: Option[List[Int]] = Some(List(1, 2, 3))George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 24 / 29
  • 25. ..........................................................................................................Monadstrait Monad[M[_]] extends Applicative[M]{def >>=[A, B](ma: M[A])(f: A => M[B]): M[B]}scala> for {| i <- List(1,2,3)| j <- List(4,5,6)| } yield i*jres15: List[Int] = List(4, 5, 6, 8, 10, 12, 12, 15, 18)George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 25 / 29
  • 26. ..........................................................................................................IODEMOGeorge Leon ev (deltamethod GmbH) Scalaz April 17, 2013 26 / 29
  • 27. ..........................................................................................................Scalaz 6 vs sevena-la-carte importstypeclass instances separated from instancestagslaw checking via scalacheckIsomorphismsAdjunc onsetc.Consult examples and tests.http://www.folone.info/blog/Scalaz-sevenMigration/George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 27 / 29
  • 28. ..........................................................................................................typelevel.scalascalazspireshapelesshttp://typelevel.org/George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 28 / 29
  • 29. ..........................................................................................................Linkslearning scalaz day n:http://eed3si9n.com/category/tags/scala/scalazRunars talk on the Strange Loop conf last year:http://www.infoq.com/presentations/Scalaz-Functional-Programming-in-Scalalambda-cats:http://spl.smugmug.com/gallery/13227630_j2MHcg/George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 29 / 29
  • 30. ..........................................................................................................Thats itQues ons?George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 30 / 29

×