Extensible effects are an alternative to monad transformers for computing with effects in a functional way. This library is based on the "free-er" monad and an "open union" of effects described in Oleg Kiselyov in Freer monads, more extensible effects.
You can learn more in the User Guide:
- your first effects
- included effects:
Reader
,Writer
,Eval
,State
,... - how to use implicits to get type-inference right
- using an open or a closed union of effects
- create your own effects
- use Member implicits
- working with different effect stacks
You can also check out this presentation at flatMap Oslo 2016 (slides).
You add eff-scalaz
as an sbt dependency:
libraryDependencies += "org.atnos" %% "eff-scalaz" % "1.7.1"
// to write types like Reader[String, ?]
addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.7.1")
// to get types like Reader[String, ?] (with more than one type parameter) correctly inferred
addCompilerPlugin("com.milessabin" % "si2712fix-plugin_2.11.8" % "1.2.0")
If you want to use the scalaz.concurrent.Future
or scalaz.concurrent.Task
effects:
libraryDependencies += "org.atnos" %% "eff-scalaz-concurrent" % "1.7.1"
eff-scalaz is a Typelevel project. This means we embrace pure, typeful, functional programming, and provide a safe and friendly environment for teaching, learning, and contributing as described in the Typelevel Code of Conduct.
Feel free to open an issue if you notice a bug, have an idea for a feature, or have a question about the code. Pull requests are also gladly accepted.