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
180
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
540
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
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
1
240
LT:「このままでいいのかな?」から一歩踏み出した私のデータキャリア選択〜社会人3年目に上京を決意したリアル〜Snowflake女子会 vol.8
snowwmn0824
0
110
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
1
290
猫でもわかるKiro Web
kentapapa
1
140
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
670
AIに会社の文脈を理解させる技術~上流工程・非エンジニアにも広げるハーネスエンジニアリング実践~
ochtum
0
150
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.8k
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
190
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
630
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
160
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
3.2k
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
1
360
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
What's in a price? How to price your products and services
michaelherold
247
13k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
530
How STYLIGHT went responsive
nonsquared
100
6.3k
Leo the Paperboy
mayatellez
10
2.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Making Projects Easy
brettharned
120
6.8k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Claude Code のすすめ
schroneko
67
230k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
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