Defer

cats.Defer
See theDefer companion object
trait Defer[F[_]] extends Serializable

Defer is a type class that shows the ability to defer creation inside of the type constructor F[_].

This comes up with F[_] types that are implemented with a trampoline or are based on function application.

The law is that defer(fa) is equivalent to fa, but not evaluated immediately, so

scala> import cats._
scala> import cats.syntax.all._

scala> var evaluated = false
scala> val dfa = Defer[Eval].defer {
    |   evaluated = true
    |   Eval.now(21)
    | }

scala> evaluated
res0: Boolean = false

scala> Eq[Eval[Int]].eqv(dfa, Eval.now(21))
res1: Boolean = true

Attributes

Companion
object
Source
Defer.scala
Graph
Supertypes
trait Serializable
class Object
trait Matchable
class Any

Members list

Value members

Abstract methods

def defer[A](fa: => F[A]): F[A]

Attributes

Source
Defer.scala

Concrete methods

def fix[A](fn: F[A] => F[A]): F[A]

Defer instances, like functions, parsers, generators, IO, etc...

Defer instances, like functions, parsers, generators, IO, etc... often are used in recursive settings where this function is useful

fix(fn) == fn(fix(fn))

example:

val parser: P[Int] = Defer[P].fix[Int] { rec => CharsIn("0123456789") | P("(") ~ rec ~ P(")") }

Note, fn may not yield a terminating value in which case both of the above F[A] run forever.

Attributes

Source
Defer.scala