From 320e60ed8efc9bde5ab90876fdc34f346dce5b8c Mon Sep 17 00:00:00 2001
From: satorg Finally we can run the resulting Note that the inferred type of There is no Note the equivalence: Subtyping relationships are "lifted backwards" by contravariant functors, such that if Instances for type constructors regardless of their type parameter such as And instances for type constructors that depend on (one of) their type parameters having instances such
as tuples (pointwise Consider a function that merges two ContT
Succeeded(user.id)
}
}
-// eval: Eval[UserUpdateResult] = cats.Later@efa3e45
+// eval: Eval[UserUpdateResult] = cats.Later@4834a712
Eval
to actually execute the computation:eval.value
// Persisting updated user to the DB: User(100,Bob,150)
@@ -308,7 +308,7 @@
// anotherComputation: ContT[Eval, UserUpdateResult, Map[String, String]] = FromFn(
// runAndThen = Single(
-// f = cats.data.ContT$$Lambda$11783/0x00007fb69600a298@257923f4,
+// f = cats.data.ContT$$Lambda$11612/0x00007f0ceffd2298@10a3bdb7,
// index = 0
// )
// )
@@ -319,7 +319,7 @@
(userFields("id").toInt)
}
}
-// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@31942c14
+// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@2f42687a
anotherEval.value
// Persisting these fields to the DB: Map(id -> 100, name -> Bob, age -> 150)
@@ -336,7 +336,7 @@ Succeeded
// updateUserModel: ContT[Eval, UserUpdateResult, User] = FromFn(
// runAndThen = Single(
-// f = cats.data.ContT$$Lambda$11783/0x00007fb69600a298@6ed4d7a1,
+// f = cats.data.ContT$$Lambda$11612/0x00007f0ceffd2298@432a03b8,
// index = 0
// )
// )
@@ -370,7 +370,7 @@
flatMap persistToDb flatMap publishEvent
// chainOfContinuations: ContT[Eval, UserUpdateResult, UserUpdateResult] = FromFn(
// runAndThen = Single(
-// f = cats.data.ContT$$Lambda$11787/0x00007fb69600ac20@639d7465,
+// f = cats.data.ContT$$Lambda$11616/0x00007f0ceffd2c20@1a57a65c,
// index = 0
// )
// )
@@ -381,7 +381,7 @@ updateUserModel
finalResult
}
}
-// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@376cdc98
+// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@7202885e
eval.value
// Updated user model
diff --git a/datatypes/eval.html b/datatypes/eval.html
index 97697f4c84..f6983dac96 100644
--- a/datatypes/eval.html
+++ b/datatypes/eval.html
@@ -257,7 +257,7 @@ println
("Running expensive calculation...")
1 + 2 * 3
}
-// lazyEval: Eval[Int] = cats.Later@a5e4e47
+// lazyEval: Eval[Int] = cats.Later@734c6604
lazyEval.value
// Running expensive calculation...
@@ -276,7 +276,7 @@ println
("Running expensive calculation...")
1 + 2 * 3
}
-// always: Eval[Int] = cats.Always@7ed93de5
+// always: Eval[Int] = cats.Always@732f1ae
always.value
// Running expensive calculation...
diff --git a/datatypes/freeapplicative.html b/datatypes/freeapplicative.html
index 2091bb52cf..b864199112 100644
--- a/datatypes/freeapplicative.html
+++ b/datatypes/freeapplicative.html
@@ -275,7 +275,7 @@
+// valid: IndexedStateT[Eval, Closed.type, Open.type, Unit] = cats.data.IndexedStateT@48631b81
val validator = prog.foldMap[FromString](compiler)
-// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11954/0x00007fb69586a0e8@1389adae
+// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11783/0x00007f0cef7a0000@6f1b8ea8
validator("1234")
// res0: Boolean = false
validator("12345")
diff --git a/datatypes/freemonad.html b/datatypes/freemonad.html
index 86fd2bf8bc..9ead491c3e 100644
--- a/datatypes/freemonad.html
+++ b/datatypes/freemonad.html
@@ -718,7 +718,7 @@
import TeletypeOps._
val state = program.foldMap(interpreter)
-// state: TeletypeState[Unit] = cats.data.IndexedStateT@23d1ac94
+// state: TeletypeState[Unit] = cats.data.IndexedStateT@fa22cdb
val initialState = Nil
// initialState: Nil.type = List()
val (stored, _) = state.run(initialState).value
@@ -789,7 +789,7 @@
val evaluated = hoisted.foldMap(tryInterpreter)
// evaluated: OptTry[Int] = OptionT(value = Success(value = Some(value = 12)))
diff --git a/datatypes/state.html b/datatypes/state.html
index e689a53f6d..503b02d43f 100644
--- a/datatypes/state.html
+++ b/datatypes/state.html
@@ -474,7 +474,7 @@
_
<- close
_ <- open
} yield ()
-// valid: IndexedStateT[Eval, Closed.type, Open.type, Unit] = cats.data.IndexedStateT@7608f30cvalid
correctly models that this computation can be executed only with an initial Closed
state.
+// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@5532741b
valid.run(Open)
// error: type mismatch;
@@ -483,7 +483,7 @@
valid.run(Closed)
-// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@36773e65
diff --git a/typeclasses/bifoldable.html b/typeclasses/bifoldable.html
index 73f0fb1c03..90272ac0b3 100644
--- a/typeclasses/bifoldable.html
+++ b/typeclasses/bifoldable.html
@@ -338,7 +338,7 @@ s, acc) => acc.map(_ |+| s),
(s, acc) => acc.map(_ |+| s)
)
-// right: Eval[String] = cats.Eval$$anon$1@986cb84
+// right: Eval[String] = cats.Eval$$anon$1@61dc1073
left === expected
// res2: Boolean = true
@@ -354,7 +354,7 @@
s
, acc) => acc.map(_ |+| s),
(s, acc) => acc.map(_ |+| s)
)
-// reversedRight: Eval[String] = cats.Eval$$anon$1@1f96ee38
+// reversedRight: Eval[String] = cats.Eval$$anon$1@4c879eba
reversedRight.value === expected
// res4: Boolean = false
diff --git a/typeclasses/bifunctor.html b/typeclasses/bifunctor.html
index 30a0decd4e..82d40e96cb 100644
--- a/typeclasses/bifunctor.html
+++ b/typeclasses/bifunctor.html
@@ -246,7 +246,7 @@ error => DomainError(error.getMessage),
dateTime => dateTime.toEpochSecond
)
-// res0: Either[DomainError, Long] = Right(value = 1737837505L)
+// res0: Either[DomainError, Long] = Right(value = 1738179807L)
Bifunctor
also defines a convenience function called leftMap
, which is defined as follows:def leftMap[A, B, C](fab: F[A, B])(f: A => C): F[C, B] = bimap(fab)(f, identity)
rightMap
however - use map
instead. The reasoning behind this is that in Cats, the instances of
diff --git a/typeclasses/bimonad.html b/typeclasses/bimonad.html
index b1180805dd..abe573f790 100644
--- a/typeclasses/bimonad.html
+++ b/typeclasses/bimonad.html
@@ -263,7 +263,7 @@ override def tailRecM[A, B](a: A)(fn: A => NonEmptyList[Either[A, B]]): NonEmptyList[B] =
???
}
-// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@77cf1cba
+// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@472d57cc
diff --git a/typeclasses/contravariant.html b/typeclasses/contravariant.html
index db815a6b2e..2d7f20a63d 100644
--- a/typeclasses/contravariant.html
+++ b/typeclasses/contravariant.html
@@ -246,7 +246,7 @@ nelBimonad.pure(true).extract === NonEmptyList.one(true).head
// res0: Boolean = true
implicit val showSalary: Show[Salary] = showMoney.contramap(_.size)
-// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@7e5212a7
+// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@2f97b692
Salary(Money(1000)).show
// res0: String = "$1000"
@@ -266,7 +266,7 @@ import scala.math.Ordered._
implicit val moneyOrdering: Ordering[Money] = Ordering.by(_.amount)
-// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@293b5584
+// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@6fe85743
Money(100) < Money(200)
// res3: Boolean = true
@@ -276,17 +276,17 @@
class A
class B extends A
val b: B = new B
-// b: B = repl.MdocSession$MdocApp$B@2628c9f2
+// b: B = repl.MdocSession$MdocApp$B@60316712
val a: A = b
-// a: A = repl.MdocSession$MdocApp$B@2628c9f2
+// a: A = repl.MdocSession$MdocApp$B@60316712
val showA: Show[A] = Show.show(a => "a!")
-// showA: Show[A] = cats.Show$$$Lambda$12765/0x00007fb6962e7240@72fc0499
+// showA: Show[A] = cats.Show$$$Lambda$12594/0x00007f0cf02b6c38@352f9666
val showB1: Show[B] = showA.contramap(b => b: A)
-// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@4d7623ad
+// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@269b6c5d
val showB2: Show[B] = showA.contramap(identity[A])
-// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12766/0x00007fb6962e76b8@71fac13d
+// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12595/0x00007f0cf02b70b0@7a155ae2
val showB3: Show[B] = Contravariant[Show].narrow[A, B](showA)
-// showB3: Show[B] = cats.Show$$$Lambda$12765/0x00007fb6962e7240@72fc0499
+// showB3: Show[B] = cats.Show$$$Lambda$12594/0x00007f0cf02b6c38@352f9666
F
is a
lawful contravariant functor and B <: A
then F[A] <: F[B]
, which is expressed by Contravariant.narrow
.Eq
implicit val eqFoo: Eq[Foo] = Eq.fromUniversalEquals
-// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@13eacfd2
+// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@479826f0
Foo(10, "") === Foo(10, "")
diff --git a/typeclasses/semigroup.html b/typeclasses/semigroup.html
index f29d322d65..af16b4376c 100644
--- a/typeclasses/semigroup.html
+++ b/typeclasses/semigroup.html
@@ -269,23 +269,23 @@
// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@310c8923
import cats.Semigroup
import cats.syntax.all._
+Semigroup[Int]
-// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@170dc252
+// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@29a8b011
Semigroup[String]
-// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@6f94317f
List
(++
)
and Set
(union
)...
+// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@7855d203
Semigroup[List[Byte]]
-// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@46ce1d0b
+// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@7855d203
Semigroup[Set[Int]]
-// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@43a7ce2a
+// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@135c0d64
trait Foo
Semigroup[List[Foo]]
-// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@46ce1d0b
combine
).
+// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@7f181f26
Semigroup[(List[Foo], Int)]
-// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@3ac19b5e
Example usage: Merging maps
Map
s that combines values if they share
diff --git a/typeclasses/show.html b/typeclasses/show.html
index b6800b97cd..f8670a6229 100644
--- a/typeclasses/show.html
+++ b/typeclasses/show.html
@@ -229,7 +229,7 @@ Show
Most often, this is unwanted behaviour, as the standard implementation of toString
on non case classes is mostly gibberish.
Consider the following example:
(new {}).toString
-// res0: String = "repl.MdocSession$MdocApp$$anon$1@4de1aaa1"
+// res0: String = "repl.MdocSession$MdocApp$$anon$1@55b5aef0"
The fact that this code compiles is a design flaw of the Java API.
We want to make things like this impossible, by offering the toString
equivalent as a type class, instead of the root of the class hierarchy.
In short, Show
allows us to only have String-conversions defined for the data types we actually want.
This still may not seem useful to you, because case classes already automatically implement toString
, while show
would have to be implemented manually for each case class.
Thankfully with the help of a small library called kittens a lot of type class instances including Show
can be derived automatically!
Cats also offers Show
syntax to make working with it easier.