From c8643142a495120564956e641f7c45f12e792105 Mon Sep 17 00:00:00 2001 From: satorg Date: Mon, 16 Sep 2024 01:53:50 +0000 Subject: [PATCH] deploy: 3970a65df7b5d09566eb40729b5f7a05925c969b --- datatypes/contt.html | 12 ++++++------ datatypes/eval.html | 4 ++-- datatypes/freeapplicative.html | 2 +- datatypes/freemonad.html | 4 ++-- datatypes/state.html | 4 ++-- typeclasses/bifoldable.html | 4 ++-- typeclasses/bifunctor.html | 2 +- typeclasses/bimonad.html | 2 +- typeclasses/contravariant.html | 16 ++++++++-------- typeclasses/eq.html | 2 +- typeclasses/semigroup.html | 12 ++++++------ typeclasses/show.html | 6 +++--- 12 files changed, 35 insertions(+), 35 deletions(-) diff --git a/datatypes/contt.html b/datatypes/contt.html index 248faa37f9..c87d72eb7c 100644 --- a/datatypes/contt.html +++ b/datatypes/contt.html @@ -286,7 +286,7 @@

ContT

Succeeded(user.id) } } -// eval: Eval[UserUpdateResult] = cats.Later@6e8b44e9 +// eval: Eval[UserUpdateResult] = cats.Later@4a1550c9

Finally we can run the resulting 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$11645/0x00007f5c57fe9ca0@26a88fd4, +// f = cats.data.ContT$$Lambda$11658/0x00007f5d2ffea298@4af69001, // index = 0 // ) // ) @@ -319,7 +319,7 @@

Succeeded(userFields("id").toInt) } } -// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@5bbe6b5a +// anotherEval: Eval[UserUpdateResult] = cats.Eval$$anon$5@5e6c5a9b anotherEval.value // Persisting these fields to the DB: Map(id -> 100, name -> Bob, age -> 150) @@ -336,7 +336,7 @@

// updateUserModel: ContT[Eval, UserUpdateResult, User] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11645/0x00007f5c57fe9ca0@453b8f2e, +// f = cats.data.ContT$$Lambda$11658/0x00007f5d2ffea298@5e910a3e, // index = 0 // ) // ) @@ -370,7 +370,7 @@

updateUserModel flatMap persistToDb flatMap publishEvent // chainOfContinuations: ContT[Eval, UserUpdateResult, UserUpdateResult] = FromFn( // runAndThen = Single( -// f = cats.data.ContT$$Lambda$11649/0x00007f5c57fea628@726d1162, +// f = cats.data.ContT$$Lambda$11662/0x00007f5d2ffeac20@1f4d7855, // index = 0 // ) // ) @@ -381,7 +381,7 @@

finalResult } } -// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@7df79d6 +// eval: Eval[UserUpdateResult] = cats.Eval$$anon$5@31ca8ca1 eval.value // Updated user model diff --git a/datatypes/eval.html b/datatypes/eval.html index 4de0193725..2f5e1c83fc 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@15397806 +// lazyEval: Eval[Int] = cats.Later@133014a6 lazyEval.value // Running expensive calculation... @@ -276,7 +276,7 @@

println("Running expensive calculation...") 1 + 2 * 3 } -// always: Eval[Int] = cats.Always@61a17019 +// always: Eval[Int] = cats.Always@672e8b15 always.value // Running expensive calculation... diff --git a/datatypes/freeapplicative.html b/datatypes/freeapplicative.html index aa2c792170..e4094d0eed 100644 --- a/datatypes/freeapplicative.html +++ b/datatypes/freeapplicative.html @@ -275,7 +275,7 @@

val validator = prog.foldMap[FromString](compiler)
-// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11807/0x00007f5c57f2af40@281a3d1f
+// validator: FromString[Boolean] = cats.instances.Function1Instances$$anon$7$$Lambda$11820/0x00007f5d2ff73648@5492c057
 validator("1234")
 // res0: Boolean = false
 validator("12345")
diff --git a/datatypes/freemonad.html b/datatypes/freemonad.html
index b5364ccba4..2dbb6f7184 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@343cfaff +// state: TeletypeState[Unit] = cats.data.IndexedStateT@7cb7cc0e 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 cb9e14e8d4..ba4c2f357b 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@ac488d1

+// valid: IndexedStateT[Eval, Closed.type, Open.type, Unit] = cats.data.IndexedStateT@4e134c49

Note that the inferred type of valid correctly models that this computation can be executed only with an initial Closed state.

valid.run(Open)
 // error: type mismatch;
@@ -483,7 +483,7 @@ 

valid.run(Closed) -// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@21b60274

+// res6: Eval[(Open.type, Unit)] = cats.Eval$$anon$1@ba9d988 diff --git a/typeclasses/bifoldable.html b/typeclasses/bifoldable.html index 19d5bf3265..a51d368975 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@4e1f85a9 +// right: Eval[String] = cats.Eval$$anon$1@6e52a71 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@790483d2 +// reversedRight: Eval[String] = cats.Eval$$anon$1@4cc99b5e reversedRight.value === expected // res4: Boolean = false diff --git a/typeclasses/bifunctor.html b/typeclasses/bifunctor.html index 96837bed62..dff8953291 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 = 1726448878L) +// res0: Either[DomainError, Long] = Right(value = 1726451601L)

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)

There is no 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 5145e9dcce..823da50e7d 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@7ac469a1 +// nelBimonad: Bimonad[NonEmptyList] = repl.MdocSession$MdocApp$$anon$1@11c93402

Note the equivalence:

nelBimonad.pure(true).extract === NonEmptyList.one(true).head
 // res0: Boolean = true
diff --git a/typeclasses/contravariant.html b/typeclasses/contravariant.html index 97fc4591d2..0a9f3f9f9f 100644 --- a/typeclasses/contravariant.html +++ b/typeclasses/contravariant.html @@ -246,7 +246,7 @@

implicit val showSalary: Show[Salary] = showMoney.contramap(_.size) -// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12597/0x00007f5c582b6478@6ae19592 +// showSalary: Show[Salary] = cats.Show$$anon$2$$Lambda$12610/0x00007f5d3028d210@17f61fe5 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@33d743a5 +// moneyOrdering: Ordering[Money] = scala.math.Ordering$$anon$5@3eea772c 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@32a5b69 +// b: B = repl.MdocSession$MdocApp$B@1ab7ee8d val a: A = b -// a: A = repl.MdocSession$MdocApp$B@32a5b69 +// a: A = repl.MdocSession$MdocApp$B@1ab7ee8d val showA: Show[A] = Show.show(a => "a!") -// showA: Show[A] = cats.Show$$$Lambda$12596/0x00007f5c582b6000@179aadda +// showA: Show[A] = cats.Show$$$Lambda$12609/0x00007f5d3028cd98@5da074a val showB1: Show[B] = showA.contramap(b => b: A) -// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12597/0x00007f5c582b6478@728f8739 +// showB1: Show[B] = cats.Show$$anon$2$$Lambda$12610/0x00007f5d3028d210@13700fc4 val showB2: Show[B] = showA.contramap(identity[A]) -// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12597/0x00007f5c582b6478@40cec1a0 +// showB2: Show[B] = cats.Show$$anon$2$$Lambda$12610/0x00007f5d3028d210@51c7b76e val showB3: Show[B] = Contravariant[Show].narrow[A, B](showA) -// showB3: Show[B] = cats.Show$$$Lambda$12596/0x00007f5c582b6000@179aadda +// showB3: Show[B] = cats.Show$$$Lambda$12609/0x00007f5d3028cd98@5da074a

Subtyping relationships are "lifted backwards" by contravariant functors, such that if F is a lawful contravariant functor and B <: A then F[A] <: F[B], which is expressed by Contravariant.narrow.

diff --git a/typeclasses/eq.html b/typeclasses/eq.html index 56ff54a499..0cc98e4ad9 100644 --- a/typeclasses/eq.html +++ b/typeclasses/eq.html @@ -257,7 +257,7 @@

Eq

implicit val eqFoo: Eq[Foo] = Eq.fromUniversalEquals -// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@5c2bbfe6 +// eqFoo: Eq[Foo] = cats.kernel.Eq$$anonfun$fromUniversalEquals$2@59f4ecb1 Foo(10, "") === Foo(10, "") diff --git a/typeclasses/semigroup.html b/typeclasses/semigroup.html index 691bb79578..767f00e42e 100644 --- a/typeclasses/semigroup.html +++ b/typeclasses/semigroup.html @@ -269,23 +269,23 @@

import cats.Semigroup import cats.syntax.all._
Semigroup[Int]
-// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@36c3242e
+// res8: Semigroup[Int] = cats.kernel.instances.IntGroup@32509746
 Semigroup[String]
-// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@164d281c
+// res9: Semigroup[String] = cats.kernel.instances.StringMonoid@2f76d6f3

Instances for type constructors regardless of their type parameter such as List (++) and Set (union)...

Semigroup[List[Byte]]
-// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@67a13d24
+// res10: Semigroup[List[Byte]] = cats.kernel.instances.ListMonoid@63360dfb
 Semigroup[Set[Int]]
-// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@5df684f3
+// res11: Semigroup[Set[Int]] = cats.kernel.instances.SetSemilattice@1bf6dc5b
 
 trait Foo
 Semigroup[List[Foo]]
-// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@67a13d24
+// res12: Semigroup[List[Foo]] = cats.kernel.instances.ListMonoid@63360dfb

And instances for type constructors that depend on (one of) their type parameters having instances such as tuples (pointwise combine).

Semigroup[(List[Foo], Int)]
-// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@72bb2937
+// res13: Semigroup[(List[Foo], Int)] = cats.kernel.Monoid$$anon$2@2d2a82c4

Example usage: Merging maps

Consider a function that merges two Maps that combines values if they share diff --git a/typeclasses/show.html b/typeclasses/show.html index 0016121ce3..e48e80340d 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@12d0371e"
+// res0: String = "repl.MdocSession$MdocApp$$anon$1@28bdb925"

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.

@@ -245,12 +245,12 @@

Show

case class Person(name: String, age: Int) implicit val showPerson: Show[Person] = Show.show(person => person.name) -// showPerson: Show[Person] = cats.Show$$$Lambda$12596/0x00007f5c582b6000@d435698 +// showPerson: Show[Person] = cats.Show$$$Lambda$12609/0x00007f5d3028cd98@61e492ce case class Department(id: Int, name: String) implicit val showDep: Show[Department] = Show.fromToString -// showDep: Show[Department] = cats.Show$$$Lambda$11640/0x00007f5c57faefb8@664fd952 +// showDep: Show[Department] = cats.Show$$$Lambda$11653/0x00007f5d2ffaf3b8@5c989fcf

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.