SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
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
PATTERNS VS ABSTRACTIONS
Patterns vs Abstractions

Code

Motivating Examples

Applications

OO PATTERNS VS FP ABSTRACTIONS

→

More (Subjective -> Objective)

→ More (Ambiguous -> Precise)
→ "Fluffy" Interfaces -> Generic Functions

3
Patterns vs Abstractions

Code

Motivating Examples

Applications

LAYING BRICKS

4
Patterns vs Abstractions

Code

Motivating Examples

Applications

WARNING

→

Abstract Algebra -> (Continuous, Infinite)

→ Real World -> usually (Discrete, Finite)

5
CODE
Patterns vs Abstractions

Code

Motivating Examples

Applications

EXAMPLE UNIX PIPE

1
2
3

find . -name "*. rb" 
| xargs egrep "#.*? TODO:" 
| wc -l
Character-based, through file descriptors

7
Patterns vs Abstractions

Code

Motivating Examples

Applications

EXAMPLE FUNCTION COMPOSITION

1

( length . mapToUpper . sanitize ) input
Value based, through functions

8
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
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
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
MOTIVATING EXAMPLES
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
Patterns vs Abstractions

Code

Motivating Examples

Applications

IO: "CONSTRUCTION" (1/2)
1

import scalaz ._, Scalaz ._, effect ._

2
3
4
5

trait MyApp {
def start (env: Env): IO[Unit]
}

6
7
8

def readConfig (env: Env):
IO[ BufferedSource ] = ???

9
10
11

def parseConfig (bs: BufferedSource ):
IO[Map[String , String ]] = ???

12
13
14

def setupMyApp (pool: ConnectionPool ):
IO[MyApp ] = ???
14
Patterns vs Abstractions

Code

Motivating Examples

Applications

IO: "CONSTRUCTION" (2/2)
1
2
3
4
5

def initialize (env: Env): IO[ MyApp] = for {
bs
<- readConfig (env)
map
<- parseConfig (bs)
app
<- setupMyApp (pool)
} yield app

6
7
8

def withCookieSessions (app: MyApp ):
IO[MyApp] = ???

9
10
11

def withServerSessions (app: MyApp ):
IO[MyApp] = ???

12
13
14
15
16

def run(env: Env): IO[Unit] = for {
app
<- initialize (env)
app2 <- withCookieSessions (app)
} yield app2. start (env)
15
Patterns vs Abstractions

Code

Motivating Examples

Applications

IO: ERROR HANDLING (1/2)
1

import scalaz ._, Scalaz ._, effect ._

2
3
4

def process (rq: Request ):
IO[ Response ] = ???

5
6
7

def showErrorTrace :
Throwable => IO[ Response ] = ???

8
9
10

def logErrorTrace :
Throwable => IO[ Response ] = ???

11
12
13

def reportErrorTrace :
Throwable => IO[ Response ] = ???

16
Patterns vs Abstractions

Code

Motivating Examples

Applications

IO: ERROR HANDLING (2/2)

1
2
3
4

def handleReq (rq: Request )( implicit e: Env) =
env match {
case Production =>
process (rq). except ( logErrorTrace )

5

case Staging =>
process (rq). except ( reportErrorTrace )

6
7
8

case _ =>
process (rq). except ( showErrorTrace )

9
10
11

}

17
Patterns vs Abstractions

Code

Motivating Examples

Applications

IO: TESTING EXAMPLE
1
2
3

import scala .io .{ BufferedSource , Codec }
import scalaz ._, Scalaz ._, effect ._
import java.io.{ ByteArrayInputStream => JBAIS
}

4
5
6
7
8
9
10
11
12

implicit val codec = Codec ("UTF -8")
IO(new BufferedSource (new JBAIS ("""{
"host": " localhost ",
"port": "5432",
" driver ": "my. awesome . PostgresDriver ",
" protocol ": " postgres ",
"name": " contactsdb "
}""". getBytes (codec . charSet ))))

18
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
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
APPLICATIONS
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
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
Patterns vs Abstractions

Code

Motivating Examples

Applications

QUESTIONS?

24

Weitere ähnliche Inhalte

Was ist angesagt?

Swift internals
Swift internalsSwift internals
Swift internalsJung Kim
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기Wanbok Choi
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)David de Boer
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overviewhesher
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation JavascriptRamesh Nair
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in RustIngvar Stepanyan
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6Solution4Future
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0Sehyun Park
 
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей КоваленкоFwdays
 
Introduction to JQ
Introduction to JQIntroduction to JQ
Introduction to JQKnoldus Inc.
 
Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Nilesh Jayanandana
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 
Functional Reactive Programming (FRP): Working with RxJS
Functional Reactive Programming (FRP): Working with RxJSFunctional Reactive Programming (FRP): Working with RxJS
Functional Reactive Programming (FRP): Working with RxJSOswald Campesato
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.boyney123
 
Letswift19-clean-architecture
Letswift19-clean-architectureLetswift19-clean-architecture
Letswift19-clean-architectureJung Kim
 

Was ist angesagt? (20)

Swift internals
Swift internalsSwift internals
Swift internals
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
Building fast interpreters in Rust
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in Rust
 
Pragmatic sbt
Pragmatic sbtPragmatic sbt
Pragmatic sbt
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6
 
Letswift Swift 3.0
Letswift Swift 3.0Letswift Swift 3.0
Letswift Swift 3.0
 
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко"Немного о функциональном программирование в JavaScript" Алексей Коваленко
"Немного о функциональном программирование в JavaScript" Алексей Коваленко
 
Introduction to JQ
Introduction to JQIntroduction to JQ
Introduction to JQ
 
Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6Introduction to Ecmascript - ES6
Introduction to Ecmascript - ES6
 
Rust ⇋ JavaScript
Rust ⇋ JavaScriptRust ⇋ JavaScript
Rust ⇋ JavaScript
 
ES6 in Real Life
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
 
Klee and angr
Klee and angrKlee and angr
Klee and angr
 
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
Functional Reactive Programming (FRP): Working with RxJS
Functional Reactive Programming (FRP): Working with RxJSFunctional Reactive Programming (FRP): Working with RxJS
Functional Reactive Programming (FRP): Working with RxJS
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
Letswift19-clean-architecture
Letswift19-clean-architectureLetswift19-clean-architecture
Letswift19-clean-architecture
 

Andere mochten auch

RESTful API using scalaz (3)
RESTful API using scalaz (3)RESTful API using scalaz (3)
RESTful API using scalaz (3)Yeshwanth Kumar
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalazoxbow_lakes
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented ProgrammingScott Wlaschin
 
Age is not an int
Age is not an intAge is not an int
Age is not an intoxbow_lakes
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)Eugene Yokota
 
Link Walking with Riak
Link Walking with RiakLink Walking with Riak
Link Walking with RiakSusan Potter
 
Writing Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptWriting Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptSusan Potter
 
Dynamo: Not Just For Datastores
Dynamo: Not Just For DatastoresDynamo: Not Just For Datastores
Dynamo: Not Just For DatastoresSusan Potter
 
From Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOSFrom Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOSSusan Potter
 
Distributed Developer Workflows using Git
Distributed Developer Workflows using GitDistributed Developer Workflows using Git
Distributed Developer Workflows using GitSusan Potter
 
Ricon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeRicon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeSusan Potter
 
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016Susan Potter
 
Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedSusan Potter
 
Designing for Concurrency
Designing for ConcurrencyDesigning for Concurrency
Designing for ConcurrencySusan Potter
 
A Scala Corrections Library
A Scala Corrections LibraryA Scala Corrections Library
A Scala Corrections LibraryPaul Phillips
 
Running Free with the Monads
Running Free with the MonadsRunning Free with the Monads
Running Free with the Monadskenbot
 
Introduction to ScalaZ
Introduction to ScalaZIntroduction to ScalaZ
Introduction to ScalaZKnoldus Inc.
 

Andere mochten auch (20)

Scalaz
ScalazScalaz
Scalaz
 
RESTful API using scalaz (3)
RESTful API using scalaz (3)RESTful API using scalaz (3)
RESTful API using scalaz (3)
 
Practical scalaz
Practical scalazPractical scalaz
Practical scalaz
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
Age is not an int
Age is not an intAge is not an int
Age is not an int
 
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)
The state of sbt 0.13, sbt server, and sbt 1.0 (ScalaSphere ver)
 
Link Walking with Riak
Link Walking with RiakLink Walking with Riak
Link Walking with Riak
 
Writing Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScriptWriting Bullet-Proof Javascript: By Using CoffeeScript
Writing Bullet-Proof Javascript: By Using CoffeeScript
 
Dynamo: Not Just For Datastores
Dynamo: Not Just For DatastoresDynamo: Not Just For Datastores
Dynamo: Not Just For Datastores
 
From Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOSFrom Zero to Application Delivery with NixOS
From Zero to Application Delivery with NixOS
 
Distributed Developer Workflows using Git
Distributed Developer Workflows using GitDistributed Developer Workflows using Git
Distributed Developer Workflows using Git
 
Ricon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeRicon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak Pipe
 
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
From Zero To Production (NixOS, Erlang) @ Erlang Factory SF 2016
 
Beyond Scala Lens
Beyond Scala LensBeyond Scala Lens
Beyond Scala Lens
 
Functional Algebra: Monoids Applied
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids Applied
 
Designing for Concurrency
Designing for ConcurrencyDesigning for Concurrency
Designing for Concurrency
 
A Scala Corrections Library
A Scala Corrections LibraryA Scala Corrections Library
A Scala Corrections Library
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
Running Free with the Monads
Running Free with the MonadsRunning Free with the Monads
Running Free with the Monads
 
Introduction to ScalaZ
Introduction to ScalaZIntroduction to ScalaZ
Introduction to ScalaZ
 

Ähnlich wie Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014

Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkDaniel Spector
 
Programming in Spark - Lessons Learned in OpenAire project
Programming in Spark - Lessons Learned in OpenAire projectProgramming in Spark - Lessons Learned in OpenAire project
Programming in Spark - Lessons Learned in OpenAire projectŁukasz Dumiszewski
 
Plugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsSadayuki Furuhashi
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyNick Sieger
 
PVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codePVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codeAndrey Karpov
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011Nick Sieger
 
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...Provectus
 
Who pulls the strings?
Who pulls the strings?Who pulls the strings?
Who pulls the strings?Ronny
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project AnalyzedPVS-Studio
 
PVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codePVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codePVS-Studio
 
Groovy on Grails by Ziya Askerov
Groovy on Grails by Ziya AskerovGroovy on Grails by Ziya Askerov
Groovy on Grails by Ziya AskerovVuqar Suleymanov
 
The operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerThe operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerAndrey Karpov
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav DukhinFwdays
 

Ähnlich wie Scalaz By Example (An IO Taster) -- PDXScala Meetup Jan 2014 (20)

Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 
Programming in Spark - Lessons Learned in OpenAire project
Programming in Spark - Lessons Learned in OpenAire projectProgramming in Spark - Lessons Learned in OpenAire project
Programming in Spark - Lessons Learned in OpenAire project
 
It's always your fault
It's always your faultIt's always your fault
It's always your fault
 
Plugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGems
 
Connecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRubyConnecting the Worlds of Java and Ruby with JRuby
Connecting the Worlds of Java and Ruby with JRuby
 
PVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codePVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's code
 
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
JRuby + Rails = Awesome Java Web Framework at Jfokus 2011
 
Mist - Serverless proxy to Apache Spark
Mist - Serverless proxy to Apache SparkMist - Serverless proxy to Apache Spark
Mist - Serverless proxy to Apache Spark
 
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...
Data Summer Conf 2018, “Mist – Serverless proxy for Apache Spark (RUS)” — Vad...
 
Who pulls the strings?
Who pulls the strings?Who pulls the strings?
Who pulls the strings?
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project Analyzed
 
PVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's codePVS-Studio: analyzing ReactOS's code
PVS-Studio: analyzing ReactOS's code
 
Grails
GrailsGrails
Grails
 
Grails
GrailsGrails
Grails
 
Groovy on Grails by Ziya Askerov
Groovy on Grails by Ziya AskerovGroovy on Grails by Ziya Askerov
Groovy on Grails by Ziya Askerov
 
The operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerThe operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzer
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Play framework
Play frameworkPlay framework
Play framework
 
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
"Applied Enterprise Metaprogramming in JavaScript", Vladyslav Dukhin
 

Mehr von Susan Potter

Thinking in Properties
Thinking in PropertiesThinking in Properties
Thinking in PropertiesSusan Potter
 
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Susan Potter
 
From Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedFrom Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedSusan Potter
 
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Susan Potter
 
Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)Susan Potter
 
Deploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatDeploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatSusan Potter
 

Mehr von Susan Potter (7)

Thinking in Properties
Thinking in PropertiesThinking in Properties
Thinking in Properties
 
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)Champaign-Urbana Javascript Meetup Talk (Jan 2020)
Champaign-Urbana Javascript Meetup Talk (Jan 2020)
 
From Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons LearnedFrom Zero to Haskell: Lessons Learned
From Zero to Haskell: Lessons Learned
 
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...Dynamically scaling a political news and activism hub (up to 5x the traffic i...
Dynamically scaling a political news and activism hub (up to 5x the traffic i...
 
Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)Functional Operations (Functional Programming at Comcast Labs Connect)
Functional Operations (Functional Programming at Comcast Labs Connect)
 
Twitter4R OAuth
Twitter4R OAuthTwitter4R OAuth
Twitter4R OAuth
 
Deploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweatDeploying distributed software services to the cloud without breaking a sweat
Deploying distributed software services to the cloud without breaking a sweat
 

Kürzlich hochgeladen

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 

Kürzlich hochgeladen (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 

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
  • 3. Patterns vs Abstractions Code Motivating Examples Applications OO PATTERNS VS FP ABSTRACTIONS → More (Subjective -> Objective) → More (Ambiguous -> Precise) → "Fluffy" Interfaces -> Generic Functions 3
  • 4. Patterns vs Abstractions Code Motivating Examples Applications LAYING BRICKS 4
  • 5. Patterns vs Abstractions Code Motivating Examples Applications WARNING → Abstract Algebra -> (Continuous, Infinite) → Real World -> usually (Discrete, Finite) 5
  • 7. Patterns vs Abstractions Code Motivating Examples Applications EXAMPLE UNIX PIPE 1 2 3 find . -name "*. rb" | xargs egrep "#.*? TODO:" | wc -l Character-based, through file descriptors 7
  • 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
  • 14. Patterns vs Abstractions Code Motivating Examples Applications IO: "CONSTRUCTION" (1/2) 1 import scalaz ._, Scalaz ._, effect ._ 2 3 4 5 trait MyApp { def start (env: Env): IO[Unit] } 6 7 8 def readConfig (env: Env): IO[ BufferedSource ] = ??? 9 10 11 def parseConfig (bs: BufferedSource ): IO[Map[String , String ]] = ??? 12 13 14 def setupMyApp (pool: ConnectionPool ): IO[MyApp ] = ??? 14
  • 15. Patterns vs Abstractions Code Motivating Examples Applications IO: "CONSTRUCTION" (2/2) 1 2 3 4 5 def initialize (env: Env): IO[ MyApp] = for { bs <- readConfig (env) map <- parseConfig (bs) app <- setupMyApp (pool) } yield app 6 7 8 def withCookieSessions (app: MyApp ): IO[MyApp] = ??? 9 10 11 def withServerSessions (app: MyApp ): IO[MyApp] = ??? 12 13 14 15 16 def run(env: Env): IO[Unit] = for { app <- initialize (env) app2 <- withCookieSessions (app) } yield app2. start (env) 15
  • 16. Patterns vs Abstractions Code Motivating Examples Applications IO: ERROR HANDLING (1/2) 1 import scalaz ._, Scalaz ._, effect ._ 2 3 4 def process (rq: Request ): IO[ Response ] = ??? 5 6 7 def showErrorTrace : Throwable => IO[ Response ] = ??? 8 9 10 def logErrorTrace : Throwable => IO[ Response ] = ??? 11 12 13 def reportErrorTrace : Throwable => IO[ Response ] = ??? 16
  • 17. Patterns vs Abstractions Code Motivating Examples Applications IO: ERROR HANDLING (2/2) 1 2 3 4 def handleReq (rq: Request )( implicit e: Env) = env match { case Production => process (rq). except ( logErrorTrace ) 5 case Staging => process (rq). except ( reportErrorTrace ) 6 7 8 case _ => process (rq). except ( showErrorTrace ) 9 10 11 } 17
  • 18. Patterns vs Abstractions Code Motivating Examples Applications IO: TESTING EXAMPLE 1 2 3 import scala .io .{ BufferedSource , Codec } import scalaz ._, Scalaz ._, effect ._ import java.io.{ ByteArrayInputStream => JBAIS } 4 5 6 7 8 9 10 11 12 implicit val codec = Codec ("UTF -8") IO(new BufferedSource (new JBAIS ("""{ "host": " localhost ", "port": "5432", " driver ": "my. awesome . PostgresDriver ", " protocol ": " postgres ", "name": " contactsdb " }""". getBytes (codec . charSet )))) 18
  • 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
  • 24. Patterns vs Abstractions Code Motivating Examples Applications QUESTIONS? 24