TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014
1. Patterns vs Abstractions
Code
Motivating Examples
Applications
SCALAZ BY EXAMPLE
Figure:
Credit http://www.flickr.com/photos/slambo_42
Susan Potter @SusanPotter
ScalaPDX January 2014
https://github.com/mbbx6spp/funalgebra
1
8. Patterns vs Abstractions
Code
Motivating Examples
Applications
EXAMPLE FUNCTION COMPOSITION
1
( length . mapToUpper . sanitize ) input
Value based, through functions
8
9. Patterns vs Abstractions
Code
Motivating Examples
Applications
VALUING VALUES IN REAL WORLD
1
2
final case class Somefink [A](a: A) extends
PossiblyMaybe [A]
final case object Nowt extends PossiblyMaybe [
Nothing ]
3
4
5
6
7
8
9
10
sealed trait PossiblyMaybe [+A]
object PossiblyMaybeOps {
def noneDefault [A]( pm: PossiblyMaybe [A])(a:
A): A = pm match {
case Somefink (x) => x
case _ => a
}
}
Note _ in second match, caters for nulls with Java interop
9
10. Patterns vs Abstractions
Code
Motivating Examples
Applications
START WITH "CLOSED" MODEL
1
2
3
4
5
6
7
8
9
final case object Production extends Env
final case object Staging extends Env
final case class QA(n: Int) extends Env
final case class Dev(u: String ) extends Env
final case object Integration extends Env
sealed trait Env
object Env {
/* companion object code ... " instances " */
}
10
11. Patterns vs Abstractions
Code
Motivating Examples
Applications
EXTEND VIA ADHOC POLYMORPHISM
1
2
3
4
5
6
// companion object for Env
object Env {
// default " instances " over type Env
// for typeclasses below
implicit val EnvRead : Read[Env] = ???
implicit val EnvShow : Show[Env] = ???
7
// maybe you want ability to use
// one of two implementations of Order [Env]
// as well as Equal [Env ]. Anyone ?
implicit val EnvOrder : Order [Env] = ???
implicit val EnvEqual : Equal [Env] = ???
8
9
10
11
12
13
}
11
13. Patterns vs Abstractions
Code
Motivating Examples
Applications
WHY USE IO MONAD?
→
Construct I/O "programs" from parts
→ Control error handling at runtime
→ Much easier to test various scenarios
→ And more …
13
19. Patterns vs Abstractions
Code
Motivating Examples
Applications
IO: TESTING EXAMPLE
1
2
// At the end of the universe we then do ...
run(env). unsafePerformIO
3
4
5
// or whatever your starting point is , e.g.
main(args). unsafePerformIO
6
7
// only ONCE ... most of the time ;)
19
20. Patterns vs Abstractions
Code
Motivating Examples
Applications
SAME TYPE, MANY "INTERFACES"
A type defined as a Monad (think: (>>=)) can also be used
as:
→
A Functor (think: fmap)
→ An Applicative (think: <*>, pure)
→ And possibly others
though not necessarily
20
22. Patterns vs Abstractions
Code
Motivating Examples
Applications
KNOWN USES
→
Monoids:
Accumulators are everywhere, almost
→
Functors:
Lots of uses with common and user defined types
→
Monads:
→
Applicatives:
→
More:
Effects, "linear happy path", and more
"validations", safer Java interop, and more
e.g. Arrows, Zippers, Lenses, Tagged Types, …
22
23. Patterns vs Abstractions
Code
Motivating Examples
Applications
THINKING ALGEBRAICALLY
→
Properties:
→
Data Types:
→
Abstractions:
property based testing: quickcheck, scalacheck
start closed, extend using "type classes",
dependent types, etc when relevant
build small building blocks, use motar to
build solid walls
→
Dist Systems:
using algebraic abstractions, properties to
build more useful distributed systems
23