SlideShare a Scribd company logo
1 of 90
Download to read offline
ZIO from
Home
Wiem Zine Elabidine
@WiemZin
Stay Safe
Functional Effects
Functional Programming
Pure functions
Referential
transparency.
Composability
Combine functions
together to build
new data.
Immutability
Values couldn’t be
changed.
Data & Functionality
Pass data through
functions to
change its
behaviors.
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def toInt(str: String): Try[Int] =
Try(str.toInt)
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def toInt(str: String): Try[Int] =
Try(str.toInt)
toInt("One")
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def toInt(str: String): Try[Int] =
Try(str.toInt)
toInt("One")
Failure(java.lang.NumberFormatException: For input string: "One")
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def nextDay(day: DayOfWeek): String =
day.plus(1) .toString
assert(nextDay(THURSDAY)))(equalTo("FRIDAY"))
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def nextDay(day: DayOfWeek): String =
day.plus(1) .toString
assert(nextDay(THURSDAY)))(equalTo("FRIDAY"))
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
def add(pasta: Pasta, sauce: Sauce,
water: Water): Cooked[Pasta] = {
val p = water.boil.map(_.put(pasta))
p.addSauce(sauce)
}
Stay home safe and
use what you have
No Side effects
Pure Function
Trust your types
Total
Test your functions
Deterministic
Effects are useful
❏ handle events
❏ Send messages
❏ read from the DataBase
❏ persist information
❏ print out the result
❏ retry in event of errors
❏ send result to other
services
❏ ...
Real World Applications
Abstract your programs!
Describe everything in
immutable data type!
Functional Effects
Effects as values?
Functional Effects
case class IO[A](unsafeRun: () => A) {
def map[B](f: A => B): IO[B] = ???
def flatMap[B](f: A => IO[B]): IO[B] = ???
}
object IO {
def effect[A](a: => A): IO[A] = new IO[A](() => a)
}
Functional Program
val program: IO[Unit] = for {
event <- IO.effect(handleEvent)
user <- IO.effect(getUser(event.userId))
_ <- IO.effect(logInfo(user))
...
} yield ()
Functional Program
val program: IO[Unit] = for {
event <- IO.effect(handleEvent)
user <- IO.effect(getUser(event.userId))
_ <- IO.effect(logInfo(user))
...
} yield ()
program.unsafeRun()
Execution
Just do it!
Description
Make a plan A - Z
Be prepared!
● Control over all type of interactions
● Testability
● Refactoring
Why Functional Effects?
Functional Effects
case class IO[A](unsafeRun: () => A) {
def map[B](f: A => B): IO[B] = ???
def flatMap[B](f: A => IO[B]): IO[B] = ???
}
object IO {
def effect[A](a: => A): IO[A] = new IO[A](() => a)
}
ZIO
Zero dependency Scala library for asynchronous and concurrent
programming using purely functional code.
Functional Effects in ZIO
ZIO[R, E, A]
Description of a program
R
E A
Dependencies
Error Success
Functional Effects in ZIO
RIO[R, A]
Description of a program
R
Throwable A
Dependencies
Error Success
Functional Effects in ZIO
URIO[R, A]
Description of a program
R
A
Dependencies
Success
Functional Effects in ZIO
Task[A]
Description of a program
Throwable A
Error Success
Functional Effects in ZIO
IO[E, A]
Description of a program
E A
Error Success
Functional Effects in ZIO
UIO[A]
Description of a program
A
Success
Run Effects
object Main extends zio.App {
override def run(args: List[String]): IO[Nothing, Int] =
program.fold(_ => 1, _ => 0)
}
OR
object Main {
Runtime.default.unsafeRun(program)
}
Error
Management
Error Management
Throwable
def divideM(a: Int, b: Int): Task[Int] =
Task(divide(a, b))
Task[Int]
Throwable Int
Error Management
Throwable
val throwException: Task[Nothing] =
Task(throw new Exception("sorry"))
Task[Nothing]
Throwable
Error Management
String
val failedIO: IO[String, Nothing] = IO.fail("sorry again")
IO[String, Nothing]
String
Error Management
Customized Errors
sealed trait Error
object Error {
case class UserNotFound(id: UserId) extends Error
case class InternalServer(t: Throwable) extends Error
...
}
val program: IO[Error, Unit] = ???
Error Management
Customized Errors
val program: IO[Error, Unit] =
for {
userId <- requestListener // IO[InternalServer, UserId]
user <- getUser(userId) // IO[UserNotFound, User]
_ <- logInfo(user) // IO[ Nothing, Unit]
_ <- sendResponse(user) // IO[InternalServer, Unit]
} yield ()
Error Management
The state of the program
val program: IO[Error, Unit] = ???
val programState: IO[Nothing, Exit[Error, Unit]] = program.run
Error Management
Exit[E, A]
Success[A]Failure[E]
Error Management
Exit[E, A]
Success[A]Failure[E]
Error Management
Exit[E, A]
Success[A]Failure[E]
Cause[E]
Cause[E]
Die
Expected Error
Unexpected Error, Exception
Fail[E]
Interrupted effect
Interrupt
Many causes?
Both(left, right)
Both(Fail(e1),
Then(Both(Fail(e2), Die(t)), Interrupt)
Then(left, right)
Example: Cause.Both
IO.fail("error1")
.zipPar(
IO.succeed(throw new Exception("💣 surprise!"))
)
Example: Cause.Both
IO.fail("error1") // Cause.Fail("error1")
.zipPar(
IO.succeed(throw new Exception("💣 surprise!"))
)
Example: Cause.Both
IO.fail("error1") // Cause.Fail("error1")
.zipPar(
IO.succeed(throw new Exception("💣 surprise!")) // Cause.Die(...💣)
)
Example: Cause.Both
IO.fail("error1") // Cause.Fail("error1")
.zipPar(
IO.succeed(throw new Exception("💣 surprise!")) // Cause.Die(...💣)
)
⇒ Both(Cause.Fail("error1"), Cause.Die(java.lang.Exception: 💣 surprise!)))
Example: Cause.Then
IO.fail("error").ensuring(IO.die(new Exception("Don't try this at Home")))
Example: Cause.Then
IO.fail("error").ensuring(IO.die(new Exception("Don't try this at Home")))
Fail("error")
Example: Cause.Then
IO.fail("error").ensuring(IO.die(new Exception("Don't try this at Home")))
Fail("error") Die(java.lang.Exception Don’t try this at Home)
Example: Cause.Then
IO.fail("error").ensuring(IO.die(new Exception("Don't try this at Home")))
Fail("error") Die(java.lang.Exception Don’t try this at Home)
⇒ Then(Cause.Fail("error"), Cause.Die(java.lang.Exception: Don’t try this at Home))
Error Management
Expose all causes:
def divide(a: Int, b: Int): IO[Cause[Throwable], Int] =
Task(a / b).sandbox
Error Management
Catch Errors:
def divide(a: Int, b: Int): Task[Int] =
Task(a / b)
.catchSome{
case _: ArithmeticException => UIO(0)
}
Error Management
Peek at the errors:
def divide(a: Int, b: Int): Task[Int] =
Task(a / b)
.tapError{
error => UIO(println(s"failed with: $e"))
}
Error Management
Fallback:
val io1: IO[Error, Int] = ???
val io2: IO[String, Int] = ???
val result: IO[String, Int] = io1.orElse(io2)
Error Management
Fallback:
val loginUser: IO[Error, Profile] = ???
val loginAnonymous: IO[Throwable, LimitedProfile] = ???
val result: IO[Throwable, Either[Profile, LimitedProfile]] =
loginUser.orElseEither(loginAnonymous)
Error Management
Recover:
def divide(a: Int, b: Int): UIO[Int] =
Task(a / b).foldM(_ => UIO(0), n => UIO(n))
Error Management
Crash it:
def divide(a: Int, b: Int): UIO[Int] =
Task(a / b).orDie
Error Management
Make defects as expected errors:
val io: IO[String, Nothing] =
IO.succeed(throw new Exception("💣"))
.unrefine(e => s"The error is: $e")
Error Management
What about fatal Errors?
Error Management
def simpleName[A](c: Class[A]) = c.getSimpleName
object Example
Task(simpleName(Example.getClass))
Error Management
def simpleName[A](c: Class[A]) = c.getSimpleName
object Example
Task(simpleName(Example.getClass))
[error] java.lang.InternalError: Malformed class name
[error] at java.lang.Class.getSimpleName(Class.java:1330)
Error Management
object Main extends zio.App {
override val platform: Platform =
Platform.default.withFatal (_ => false)
override def run(args: List[String]): ZIO[zio.ZEnv, Nothing, Int] = {
Task(simpleName(Example.getClass)).fold(_ =>1, _ => 0)
}
}
Error Management
override val platform: Platform = new Platform {
val executor = Executor.makeDefault(2)
val tracing = Tracing.disabled
def fatal(t: Throwable): Boolean =
!t.isInstanceOf[InternalError] && t.isInstanceOf[VirtualMachineError]
def reportFatal(t: Throwable): Nothing = {
t.printStackTrace()
throw t
}
def reportFailure(cause: Cause[Any]): Unit = {
if (cause.died)
System.err.println(cause.prettyPrint)
}
...
}
Build concurrent
programs
ZIO Fibers
Fibers are lightweight mechanism of concurrency.
OS Thread
ZIO Fiber
Task1 Task2 Task3 ... ..
How ZIO runs Effects?
ZIO[R, E, A]
How ZIO runs Effects?
ZIO[R, E, A]
R => IO[E, A]
How ZIO runs Effects?
ZIO[R, E, A]
R => IO[E, A]
How ZIO runs Effects?
ZIO[R, E, A]
R => IO[E, A]
How ZIO runs Effects?
IO[E, A]
How ZIO runs Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
How ZIO runs Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
How ZIO runs Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
How ZIO runs concurrent Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
IO[Nothing,Fiber[E, A]]
fork
How ZIO runs concurrent Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
IO[Nothing,Fiber[E, A]]
fork
How ZIO runs concurrent Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
IO[Nothing,Fiber[E, A]]
fork
Fiber[E, A]
unsafeRun
How ZIO runs concurrent Effects?
IO[E, A]
Fiber[E, A]
unsafeRun
IO[Nothing,Fiber[E, A]]
fork
Fiber[E, A]
unsafeRun
Concurrent Tasks
trait ZIO[R, E, A] {
def race(that: ZIO[R, E, A]): ZIO[R, E, A]
def raceAll(ios: Iterable[ZIO[R, E, A]]): ZIO[R, E, A]
def zipPar(that: ZIO[R, E, B]): ZIO[R, E, (A, B)]
def on(ec: ExecutionContext): ZIO[R, E, A]
...
}
object ZIO {
def foreachPar(as: Iterable[A])(fn: A => ZIO[R, E, B]): ZIO[R, E, List[B]]
...
}
Concurrent Tasks
def getUserInfo(id: Id): Task[(User, Profile)] =
fetchUser(id).zipPar(fetchProfile(id))
Task 1 Task 2
(User, Profile)
Example
case class IlForno(queue: Queue[Request], currentIngredients: Ref[Ingredients]) {
def handleRequests(p: Promise[Nothing, Unit]): ZIO[Clock, MissingIngredient, Unit] =
(for {
request <- queue.take
rest <- currentIngredients.update(preparePizza(request, _))
_ <- evaluate(rest)
} yield ())
.tapError(_ => p.succeed(()))
.repeat(Schedule.duration(8.hours) && Schedule.spaced(10.minutes))
.unit
val listenRequests: IO[Error, Unit] = ???
}
val program: ZIO[Clock, Error, Unit] = for {
ilForno <- IlForno(initialIngredient)
f1 <- ilForno.listenRequests.fork
p <- Promise.make[Nothing, Unit]
f2 <- ilForno.handleRequests(p).fork
_ <- p.await
_ <- f1.interrupt.zipPar(f2.interrupt)
} yield ()
Example
Example
val program: ZIO[Clock, Error, Unit] = for {
ilForno <- IlForno(initialIngredient)
f1 <- ilForno.listenRequests.fork
p <- Promise.make[Nothing, Unit]
f2 <- ilForno.handleRequests(p).fork
_ <- p.await
_ <- f1.interrupt.zipPar(f2.interrupt)
} yield ()
Example
val program: ZIO[Clock, Error, Unit] = for {
ilForno <- IlForno(initialIngredient)
f1 <- ilForno.listenRequests.fork
p <- Promise.make[Nothing, Unit]
f2 <- ilForno.handleRequests(p).fork
_ <- p.await
_ <- f1.interrupt.zipPar(f2.interrupt)
} yield ()
Example
val program: ZIO[Clock, Error, Unit] = for {
ilForno <- IlForno(initialIngredient)
f1 <- ilForno.listenRequests.fork
p <- Promise.make[Nothing, Unit]
f2 <- ilForno.handleRequests(p).fork
_ <- p.await
_ <- f1.interrupt.zipPar(f2.interrupt)
} yield ()
Resource
Management
Resource Management
File Connection
Open / close / use = Acquire / release / use
Database Clients
Resource Management
IO.effect(startApp)
.ensuring(
console.putStr("Shutdown ..."))
ensuring
01
Resource Management
IO.effect(startApp)
.ensuring(
console.putStr("Shutdown ..."))
createClient(config)
.bracket(_.close)(c =>
processEvents(c))
ensuring bracket
01 02
Resource Management
IO.effect(startApp)
.ensuring(
console.putStr("Shutdown ..."))
ensuring
val resource =
Managed.make(openFile(file))(_.close)
...
resource.use(computeLines)
Managementbracket
01 0302
createClient(config)
.bracket(_.close)(c =>
processEvents(c))
Resource Management
● You can use the methods provided by the dependencies in your
program.
● once you provide a layer or an environment, the implementation
will be acquired and used then released at the end.
ZIO Environment & ZLayer[R, E, A]
ZIO
is Awesome
WrapUp
documentation
https://github.com/zio/zio
zio.dev
ZIO projects
Blog post
https://medium.com/@wiemzin
CREDITS: This presentation template was
created by Slidesgo, including icons by Flaticon,
and infographics & images by Freepik
THANKS
Follow me: @WiemZin
Please keep this slide for attribution

More Related Content

What's hot

Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldJorge Vásquez
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Scott Wlaschin
 
Scalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsScalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsJohn De Goes
 
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional ProgrammingZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional ProgrammingJohn De Goes
 
An introduction to property based testing
An introduction to property based testingAn introduction to property based testing
An introduction to property based testingScott Wlaschin
 
Implementing the IO Monad in Scala
Implementing the IO Monad in ScalaImplementing the IO Monad in Scala
Implementing the IO Monad in ScalaHermann Hueck
 
Learning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a NeckbeardLearning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a NeckbeardKelsey Gilmore-Innis
 
Dr Frankenfunctor and the Monadster
Dr Frankenfunctor and the MonadsterDr Frankenfunctor and the Monadster
Dr Frankenfunctor and the MonadsterScott Wlaschin
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based TestingC4Media
 
One Monad to Rule Them All
One Monad to Rule Them AllOne Monad to Rule Them All
One Monad to Rule Them AllJohn De Goes
 
The lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of testsThe lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of testsScott Wlaschin
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioFunctional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioLuis Atencio
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Scott Wlaschin
 
Property-Based Testing
Property-Based TestingProperty-Based Testing
Property-Based TestingShai Geva
 
Twins: Object Oriented Programming and Functional Programming
Twins: Object Oriented Programming and Functional ProgrammingTwins: Object Oriented Programming and Functional Programming
Twins: Object Oriented Programming and Functional ProgrammingRichardWarburton
 
Python programming workshop session 3
Python programming workshop session 3Python programming workshop session 3
Python programming workshop session 3Abdul Haseeb
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Datagreenwop
 

What's hot (20)

Functional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorldFunctional Programming 101 with Scala and ZIO @FunctionalWorld
Functional Programming 101 with Scala and ZIO @FunctionalWorld
 
Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)Functional Programming Patterns (NDC London 2014)
Functional Programming Patterns (NDC London 2014)
 
Scalaz 8 vs Akka Actors
Scalaz 8 vs Akka ActorsScalaz 8 vs Akka Actors
Scalaz 8 vs Akka Actors
 
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional ProgrammingZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
ZIO Schedule: Conquering Flakiness & Recurrence with Pure Functional Programming
 
An introduction to property based testing
An introduction to property based testingAn introduction to property based testing
An introduction to property based testing
 
Implementing the IO Monad in Scala
Implementing the IO Monad in ScalaImplementing the IO Monad in Scala
Implementing the IO Monad in Scala
 
Learning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a NeckbeardLearning Functional Programming Without Growing a Neckbeard
Learning Functional Programming Without Growing a Neckbeard
 
Dr Frankenfunctor and the Monadster
Dr Frankenfunctor and the MonadsterDr Frankenfunctor and the Monadster
Dr Frankenfunctor and the Monadster
 
An Introduction to Property Based Testing
An Introduction to Property Based TestingAn Introduction to Property Based Testing
An Introduction to Property Based Testing
 
One Monad to Rule Them All
One Monad to Rule Them AllOne Monad to Rule Them All
One Monad to Rule Them All
 
The lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of testsThe lazy programmer's guide to writing thousands of tests
The lazy programmer's guide to writing thousands of tests
 
Functional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis AtencioFunctional Programming in JavaScript by Luis Atencio
Functional Programming in JavaScript by Luis Atencio
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 
Property-Based Testing
Property-Based TestingProperty-Based Testing
Property-Based Testing
 
Twins: Object Oriented Programming and Functional Programming
Twins: Object Oriented Programming and Functional ProgrammingTwins: Object Oriented Programming and Functional Programming
Twins: Object Oriented Programming and Functional Programming
 
ZIO Queue
ZIO QueueZIO Queue
ZIO Queue
 
ppopoff
ppopoffppopoff
ppopoff
 
Python programming workshop session 3
Python programming workshop session 3Python programming workshop session 3
Python programming workshop session 3
 
Time for Functions
Time for FunctionsTime for Functions
Time for Functions
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 

Similar to Zio from Home

Principled Error Handling - Scalapeño
Principled Error Handling - ScalapeñoPrincipled Error Handling - Scalapeño
Principled Error Handling - ScalapeñoLuka Jacobowitz
 
cats.effect.IO - Scala Vienna Meetup February 2019
cats.effect.IO - Scala Vienna Meetup February 2019cats.effect.IO - Scala Vienna Meetup February 2019
cats.effect.IO - Scala Vienna Meetup February 2019Daniel Pfeiffer
 
Principled Error Handling with FP
Principled Error Handling with FPPrincipled Error Handling with FP
Principled Error Handling with FPLuka Jacobowitz
 
Functions, Types, Programs and Effects
Functions, Types, Programs and EffectsFunctions, Types, Programs and Effects
Functions, Types, Programs and EffectsRaymond Roestenburg
 
2011 py con
2011 py con2011 py con
2011 py conEing Ong
 
Un dsl pour ma base de données
Un dsl pour ma base de donnéesUn dsl pour ma base de données
Un dsl pour ma base de donnéesRomain Lecomte
 
Eclipse Summit Europe '10 - Test UI Aspects of Plug-ins
Eclipse Summit Europe '10 - Test UI Aspects of Plug-insEclipse Summit Europe '10 - Test UI Aspects of Plug-ins
Eclipse Summit Europe '10 - Test UI Aspects of Plug-insTonny Madsen
 
Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazHeiko Seeberger
 
SeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovySeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovyTed Leung
 
Hello, I need some assistance in writing a java program THAT MUST US.pdf
Hello, I need some assistance in writing a java program THAT MUST US.pdfHello, I need some assistance in writing a java program THAT MUST US.pdf
Hello, I need some assistance in writing a java program THAT MUST US.pdfFashionColZone
 
Test Driven Development in Python
Test Driven Development in PythonTest Driven Development in Python
Test Driven Development in PythonAnoop Thomas Mathew
 
Drinking the free kool-aid
Drinking the free kool-aidDrinking the free kool-aid
Drinking the free kool-aidDavid Hoyt
 
Unit Testing Front End JavaScript
Unit Testing Front End JavaScriptUnit Testing Front End JavaScript
Unit Testing Front End JavaScriptFITC
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con GroovySoftware Guru
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05cKaz Yoshikawa
 
Blazing Fast, Pure Effects without Monads — LambdaConf 2018
Blazing Fast, Pure Effects without Monads — LambdaConf 2018Blazing Fast, Pure Effects without Monads — LambdaConf 2018
Blazing Fast, Pure Effects without Monads — LambdaConf 2018John De Goes
 

Similar to Zio from Home (20)

Principled Error Handling - Scalapeño
Principled Error Handling - ScalapeñoPrincipled Error Handling - Scalapeño
Principled Error Handling - Scalapeño
 
cats.effect.IO - Scala Vienna Meetup February 2019
cats.effect.IO - Scala Vienna Meetup February 2019cats.effect.IO - Scala Vienna Meetup February 2019
cats.effect.IO - Scala Vienna Meetup February 2019
 
Principled Error Handling with FP
Principled Error Handling with FPPrincipled Error Handling with FP
Principled Error Handling with FP
 
Functions, Types, Programs and Effects
Functions, Types, Programs and EffectsFunctions, Types, Programs and Effects
Functions, Types, Programs and Effects
 
2011 py con
2011 py con2011 py con
2011 py con
 
Of class1
Of class1Of class1
Of class1
 
Ray tracing with ZIO-ZLayer
Ray tracing with ZIO-ZLayerRay tracing with ZIO-ZLayer
Ray tracing with ZIO-ZLayer
 
Un dsl pour ma base de données
Un dsl pour ma base de donnéesUn dsl pour ma base de données
Un dsl pour ma base de données
 
Eclipse Summit Europe '10 - Test UI Aspects of Plug-ins
Eclipse Summit Europe '10 - Test UI Aspects of Plug-insEclipse Summit Europe '10 - Test UI Aspects of Plug-ins
Eclipse Summit Europe '10 - Test UI Aspects of Plug-ins
 
Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of Scalaz
 
SeaJUG March 2004 - Groovy
SeaJUG March 2004 - GroovySeaJUG March 2004 - Groovy
SeaJUG March 2004 - Groovy
 
Hello, I need some assistance in writing a java program THAT MUST US.pdf
Hello, I need some assistance in writing a java program THAT MUST US.pdfHello, I need some assistance in writing a java program THAT MUST US.pdf
Hello, I need some assistance in writing a java program THAT MUST US.pdf
 
Test Driven Development in Python
Test Driven Development in PythonTest Driven Development in Python
Test Driven Development in Python
 
Drinking the free kool-aid
Drinking the free kool-aidDrinking the free kool-aid
Drinking the free kool-aid
 
Unit Testing Front End JavaScript
Unit Testing Front End JavaScriptUnit Testing Front End JavaScript
Unit Testing Front End JavaScript
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Desarrollo para Android con Groovy
Desarrollo para Android con GroovyDesarrollo para Android con Groovy
Desarrollo para Android con Groovy
 
What are monads?
What are monads?What are monads?
What are monads?
 
Idioms in swift 2016 05c
Idioms in swift 2016 05cIdioms in swift 2016 05c
Idioms in swift 2016 05c
 
Blazing Fast, Pure Effects without Monads — LambdaConf 2018
Blazing Fast, Pure Effects without Monads — LambdaConf 2018Blazing Fast, Pure Effects without Monads — LambdaConf 2018
Blazing Fast, Pure Effects without Monads — LambdaConf 2018
 

Recently uploaded

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
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
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
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
 
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
 
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 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
 
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
 
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
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
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
 
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
 

Recently uploaded (20)

Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
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
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
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
 
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
 
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 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?
 
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
 
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...
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
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...
 
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
 

Zio from Home