Comonad
Comonad
Comonad is the dual of Monad. Whereas Monads allow for the composition of effectful functions, Comonads allow for composition of functions that extract the value from their context.
Must obey the laws defined in cats.laws.ComonadLaws.
- Companion
- object
Value members
Abstract methods
extract
is the dual of pure
on Monad (via Applicative
)
and extracts the value from its context
extract
is the dual of pure
on Monad (via Applicative
)
and extracts the value from its context
Example:
scala> import cats.Id
scala> import cats.Comonad
scala> val id: Id[Int] = 3
scala> Comonad[Id].extract(id)
res0: cats.Id[Int] = 3
Inherited methods
Replaces the A
value in F[A]
with the supplied value.
Replaces the A
value in F[A]
with the supplied value.
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList
scala> Functor[List].as(List(1,2,3), "hello")
res0: List[String] = List(hello, hello, hello)
- Inherited from
- Functor
coflatMap
is the dual of flatMap
on FlatMap
. It applies
a value in a context to a function that takes a value
in a context and returns a normal value.
coflatMap
is the dual of flatMap
on FlatMap
. It applies
a value in a context to a function that takes a value
in a context and returns a normal value.
Example:
scala> import cats.implicits._
scala> import cats.CoflatMap
scala> val fa = Some(3)
scala> def f(a: Option[Int]): Int = a match {
| case Some(x) => 2 * x
| case None => 0 }
scala> CoflatMap[Option].coflatMap(fa)(f)
res0: Option[Int] = Some(6)
- Inherited from
- CoflatMap
coflatten
is the dual of flatten
on FlatMap
. Whereas flatten removes
a layer of F
, coflatten adds a layer of F
coflatten
is the dual of flatten
on FlatMap
. Whereas flatten removes
a layer of F
, coflatten adds a layer of F
Example:
scala> import cats.implicits._
scala> import cats.CoflatMap
scala> val fa = Some(3)
fa: Option[Int] = Some(3)
scala> CoflatMap[Option].coflatten(fa)
res0: Option[Option[Int]] = Some(Some(3))
- Inherited from
- CoflatMap
Compose Invariant F[_]
and G[_]
then produce Invariant[F[G[_]]]
using their imap
.
Compose Invariant F[_]
and G[_]
then produce Invariant[F[G[_]]]
using their imap
.
Example:
scala> import cats.implicits._
scala> import scala.concurrent.duration._
scala> val durSemigroupList: Semigroup[List[FiniteDuration]] =
| Invariant[Semigroup].compose[List].imap(Semigroup[List[Long]])(Duration.fromNanos)(_.toNanos)
scala> durSemigroupList.combine(List(2.seconds, 3.seconds), List(4.seconds))
res1: List[FiniteDuration] = List(2 seconds, 3 seconds, 4 seconds)
- Inherited from
- Invariant
Compose Invariant F[_]
and Functor G[_]
then produce Invariant[F[G[_]]]
using F's imap
and G's map
.
Compose Invariant F[_]
and Functor G[_]
then produce Invariant[F[G[_]]]
using F's imap
and G's map
.
Example:
scala> import cats.implicits._
scala> import scala.concurrent.duration._
scala> val durSemigroupList: Semigroup[List[FiniteDuration]] =
| Invariant[Semigroup]
| .composeFunctor[List]
| .imap(Semigroup[List[Long]])(Duration.fromNanos)(_.toNanos)
scala> durSemigroupList.combine(List(2.seconds, 3.seconds), List(4.seconds))
res1: List[FiniteDuration] = List(2 seconds, 3 seconds, 4 seconds)
- Inherited from
- Invariant
Alias for map, since map can't be injected as syntax if
the implementing type already had a built-in .map
method.
Alias for map, since map can't be injected as syntax if
the implementing type already had a built-in .map
method.
Example:
scala> import cats.implicits._
scala> val m: Map[Int, String] = Map(1 -> "hi", 2 -> "there", 3 -> "you")
scala> m.fmap(_ ++ "!")
res0: Map[Int,String] = Map(1 -> hi!, 2 -> there!, 3 -> you!)
- Inherited from
- Functor
Tuple the values in fa with the result of applying a function with the value
Tuple the values in fa with the result of applying a function with the value
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption
scala> Functor[Option].fproduct(Option(42))(_.toString)
res0: Option[(Int, String)] = Some((42,42))
- Inherited from
- Functor
Pair the result of function application with A
.
Pair the result of function application with A
.
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption
scala> Functor[Option].fproductLeft(Option(42))(_.toString)
res0: Option[(String, Int)] = Some((42,42))
- Inherited from
- Functor
Lifts if
to Functor
Lifts if
to Functor
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList
scala> Functor[List].ifF(List(true, false, false))(1, 0)
res0: List[Int] = List(1, 0, 0)
- Inherited from
- Functor
Lift a function f to operate on Functors
Lift a function f to operate on Functors
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption
scala> val o = Option(42)
scala> Functor[Option].lift((x: Int) => x + 10)(o)
res0: Option[Int] = Some(52)
- Inherited from
- Functor
Tuples the A
value in F[A]
with the supplied B
value, with the B
value on the left.
Tuples the A
value in F[A]
with the supplied B
value, with the B
value on the left.
Example:
scala> import scala.collection.immutable.Queue
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForQueue
scala> Functor[Queue].tupleLeft(Queue("hello", "world"), 42)
res0: scala.collection.immutable.Queue[(Int, String)] = Queue((42,hello), (42,world))
- Inherited from
- Functor
Tuples the A
value in F[A]
with the supplied B
value, with the B
value on the right.
Tuples the A
value in F[A]
with the supplied B
value, with the B
value on the right.
Example:
scala> import scala.collection.immutable.Queue
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForQueue
scala> Functor[Queue].tupleRight(Queue("hello", "world"), 42)
res0: scala.collection.immutable.Queue[(String, Int)] = Queue((hello,42), (world,42))
- Inherited from
- Functor
Un-zips an F[(A, B)]
consisting of element pairs or Tuple2 into two separate F's tupled.
Un-zips an F[(A, B)]
consisting of element pairs or Tuple2 into two separate F's tupled.
NOTE: Check for effect duplication, possibly memoize before
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList
scala> Functor[List].unzip(List((1,2), (3, 4)))
res0: (List[Int], List[Int]) = (List(1, 3),List(2, 4))
- Inherited from
- Functor
Empty the fa of the values, preserving the structure
Empty the fa of the values, preserving the structure
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForList
scala> Functor[List].void(List(1,2,3))
res0: List[Unit] = List((), (), ())
- Inherited from
- Functor
Lifts natural subtyping covariance of covariant Functors.
Lifts natural subtyping covariance of covariant Functors.
NOTE: In certain (perhaps contrived) situations that rely on universal
equality this can result in a ClassCastException
, because it is
implemented as a type cast. It could be implemented as map(identity)
, but
according to the functor laws, that should be equal to fa
, and a type
cast is often much more performant.
See this example
of widen
creating a ClassCastException
.
Example:
scala> import cats.Functor
scala> import cats.implicits.catsStdInstancesForOption
scala> val s = Some(42)
scala> Functor[Option].widen(s)
res0: Option[Int] = Some(42)
- Inherited from
- Functor