Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Scalaz talk
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
George Leontiev
April 17, 2013
Technology
540
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Scalaz talk
Berlin, April 17
George Leontiev
April 17, 2013
More Decks by George Leontiev
See All by George Leontiev
GraphQL at Twitter
folone
0
190
Typelevel programming in Scala (with lies)
folone
0
500
Case study: typelevel programming in real world
folone
1
660
Type level programming in Scala
folone
0
550
ScalaUA: Typelevel Scala
folone
2
250
Hands-on TLC
folone
2
1k
42: Rise of the dependent types
folone
2
510
∃ PROLOG |PROLOG ∈ SCALA
folone
5
1.2k
42.type: Literal-based Singleton types
folone
4
1.6k
Other Decks in Technology
See All in Technology
AI時代のGraphQL
joere
3
380
野蛮なアジャイル [サイボウズ発!]組織の常識を覆した反骨のスクラム実践記 / Barbaric Agile - Enterprise Agile Study Group
ama_ch
0
140
トークン化預金DCJPYの取り組みと活用ユースケース
finengine
0
250
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
1
240
Vue.jsのGitHubから学ぶ意思決定
yut0naga1_fa
1
120
How to Design Configuration for Rails Applications
willnet
2
1.2k
生成AI時代、PMは事業責任者に進化するともっと面白い〜PMだからこそ事業構造を動かせる時代に〜
kakehashi
PRO
0
750
【データ横丁主催】AI エージェント時代のTranslytical Data Platform
shisyu_gaku
0
280
Draft AIエージェントの トークン消費を最小化する 8つの原則
kinopeee
3
1.5k
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
150
フィンテック養成勉強会#68
finengine
0
240
Microsoft のサポート ライフサイクルを理解する
murachiakira
PRO
0
150
Featured
See All Featured
Docker and Python
trallard
47
4.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
740
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
840
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
790
First, design no harm
axbom
PRO
2
1.4k
Automating Front-end Workflow
addyosmani
1370
210k
GraphQLとの向き合い方2022年版
quramy
50
15k
The Language of Interfaces
destraynor
162
27k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
Transcript
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . . . . . . . . Scalaz Learn You Yet Another Real World Gentle Haskell (LYYARWGH) ((c) sproingie) George Leon ev deltamethod GmbH April 17, 2013 (λx.folonexlambda-calcul.us)@ folone.info George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 1 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . This talk https://github.com/folone/scalaz-talk-berlin https://speakerdeck.com/folone/scalaz-talk George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 2 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Agenda Some hotness without context, to draw a en on (Op on, Boolean, Memo) Typeclasses Monoid Functor, Applica ve, Monad Effects scalaz 6 vs seven typelevel.scala George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 3 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . What is scalaz Purely func onal datatypes (Fingertree, HList, DList, Trees, Zippers, Nel, ImmutableArray) Typeclasses Effects Concurrency George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 4 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- typesafe equals s> "" == 5 res0: Boolean = false s> "" === 5 <console>:14: error: type mismatch; found : Int(5) required: java.lang.String "" === 5 ^ <spoiler>∀ stuff ∈ scalaz ≡ scala.stdlib | stuff is typesafe ∨ stuff is strict</spoiler> George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 5 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- op ons s> some(5) getOrElse 0 res1: Int = 5 s> some(5) | 0 res2: Int = 5 s> some(1) getOrElse "ok" res3: Any = 1 s> some(1) | "ok" <console>:14: error: type mismatch; found : java.lang.String("ok") required: Int some(1) | "ok" ^ s> ~some(5) // Monoids res4: Int = 5 s> ~none[Int] // NB: Beware of unary_~ on Validations (swap res5: Int = 0 George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 6 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- op ons II // Smart constructors s> :t Some(1) s> :t None Some[Int] None.type s> :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.type List(Some(1),None).foldLeft(None){(_, v) => v} ^ s> List(Some(1),None).foldLeft(none[Int]){(_, v) => v} res11: Option[Int] = None George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 7 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- booleans scala> true ? println("true") | println("false") true scala> true ?? 5 scala> true !? 5 res14: Int = 5 res15: Int = 0 scala> false ?? 5 scala> false !? 5 res15: Int = 0 res17: Int = 5 George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 8 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- func on composi on val a = (_:Int) + 6 val b = (_:Int).toString val c = (_:String).length scala> 5 |> a |> b |> c res18: Int = 2 scala> //(c · b · a) apply 5 // contramap res19: Int = 2 scala> 5 |> //(a ◦ b ◦ c) // map res20: Int = 2 // contramap === flip . map George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 9 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- Memo def func(s: String) = // Expensive computation scala> Memo.immutableHashMapMemo(func) res11: String => java.lang.String = <function1> // Different strategies mutableHashMapMemo arrayMemo // sized immutableListMemo immutableTreeMapMemo doubleArrayMemo // memoizing Double results != sentinel weakHashMapMemo // GC George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 10 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- Trampoline def even(n: Int): Boolean = if (n == 0) true else odd(n - 1) def odd(n: Int): Boolean = if (n == 0) false else even(n - 1) scala> even(30000) George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 11 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- Trampoline def 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).run George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 12 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- Trampoline def 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 => result case _ => loop(n - 1, next + result, next) } loop(n, 1, 0) } George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 13 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Examples -- Trampoline def 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 magic Consult @runarorama's paper "Stackless Scala with Free Monads" George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 14 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Typeclasses George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 15 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Typeclasses George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 16 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Typeclasses http://www.haskell.org/haskellwiki/Typeclassopedia http://typeclassopedia.bitbucket.org/ George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 17 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Typeclasses A 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/163423 George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 18 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . 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 = a trait Semigroup[F] { def append(a1: F, a2: F): F } trait Monoid[F] extends Semigroup[F] { def zero: F } // scalacheck-binding import scalaz.scalacheck.ScalazProperties._ semigroup.laws[Int] monoid.laws[String] George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 19 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Monoids scala> 1 |+| 5 res2: Int = 6 scala> Multiplication(2) |+| Multiplication(3) res4: Int @@ Multiplication = 6 scala> some(1) |+| some(5) res5: Option[Int] = Some(6) // Monoids beget monoids scala> 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
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Monoids scala> List(1,2,3).suml res16: Int = 6 scala> List("OH ", "HAI", "!").suml res17: java.lang.String = OH HAI! George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 21 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Functors trait 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
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Applica ves trait 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) * 5 res10: 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
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Applica ves scala> List(some(1), some(2), some(3)) res21: List[Option[Int]] = List(Some(1), Some(2), Some(3)) scala> .sequence res22: Option[List[Int]] = Some(List(1, 2, 3)) scala> res21.traverse(x => some(x)) // sequence . map res23: Option[List[Int]] = Some(List(1, 2, 3)) George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 24 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Monads trait 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*j res15: List[Int] = List(4, 5, 6, 8, 10, 12, 12, 15, 18) George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 25 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . IO DEMO George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 26 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Scalaz 6 vs seven a-la-carte imports typeclass instances separated from instances tags law checking via scalacheck Isomorphisms Adjunc ons etc. Consult examples and tests. http://www.folone.info/blog/Scalaz-sevenMigration/ George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 27 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . typelevel.scala scalaz spire shapeless http://typelevel.org/ George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 28 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . Links learning scalaz day n: http://eed3si9n.com/category/tags/scala/scalaz Runar's talk on the Strange Loop conf last year: http://www.infoq.com/presentations/ Scalaz-Functional-Programming-in-Scala lambda-cats: http://spl.smugmug.com/gallery/13227630_j2MHcg/ George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 29 / 29
. . . .. . . . .. . .
. .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . .. . . . .. . . . . .. . . . .. . . . . .. . . . .. . . . .. . That's it Ques ons? George Leon ev (deltamethod GmbH) Scalaz April 17, 2013 30 / 29