sealed
trait
Eff[R, A] extends AnyRef
Value Members
-
final
def
!=(arg0: Any): Boolean
-
final
def
##(): Int
-
def
*>[B](fb: Eff[R, B]): Eff[R, B]
-
def
<*[B](fb: Eff[R, B]): Eff[R, A]
-
def
<<[B](fb: Eff[R, B]): Eff[R, A]
-
final
def
==(arg0: Any): Boolean
-
def
>>[B](fb: Eff[R, B]): Eff[R, B]
-
def
addLast(l: ⇒ Eff[R, Unit]): Eff[R, A]
-
def
ap[B](f: Eff[R, (A) ⇒ B]): Eff[R, B]
-
final
def
asInstanceOf[T0]: T0
-
def
clone(): AnyRef
-
-
-
def
finalize(): Unit
-
def
flatMap[B](f: (A) ⇒ Eff[R, B]): Eff[R, B]
-
def
flatten[B](implicit ev: <:<[A, Eff[R, B]]): Eff[R, B]
-
final
def
getClass(): Class[_]
-
def
hashCode(): Int
-
final
def
isInstanceOf[T0]: Boolean
-
def
map[B](f: (A) ⇒ B): Eff[R, B]
-
-
final
def
notify(): Unit
-
final
def
notifyAll(): Unit
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
-
def
toString(): String
-
final
def
wait(): Unit
-
final
def
wait(arg0: Long, arg1: Int): Unit
-
final
def
wait(arg0: Long): Unit
Effects of type R, returning a value of type A
It is implemented as a "Free-er" monad with extensible effects:
Arrs
typeThe monad implementation for this type is really simple:
point
is Purebind
simply appends the binding function to theArrs
continuationImportant:
The list of continuations is NOT implemented as a type sequence but simply as a Vector[Any => Eff[R, Any]]
This means that various
.asInstanceOf
are present in the implementation and could lead to burns and severe harm. Use with caution!Similarly the list of effects in the applicative case is untyped and interpreters for those effects are supposed to create a list of values to feed the mapping function. If an interpreter doesn't create a list of values of the right size and with the right types, there will be a runtime exception.
The Pure, Impure and ImpureAp cases also incorporate a "last" action returning no value but just used for side-effects (shutting down an execution context for example). This action is meant to be executed at the end of all computations, regardless of the number of flatMaps added on the Eff value.
Since this last action will be executed, its value never collected so if it throws an exception it is possible to print it by defining the eff.debuglast system property (-Deff.debuglast=true)
http://okmij.org/ftp/Haskell/extensible/more.pdf