Skip to content

Commit

Permalink
IM instances need to be "forwarded" in Cartesian companion
Browse files Browse the repository at this point in the history
This example (which is part of the tut):

```scala
import cats.std.all._
import cats.syntax.all._

// Let's build a Semigroup for this case class
case class Foo(a: String, c: List[Double])

implicit val fooSemigroup: Semigroup[Foo] = (
  (implicitly[Semigroup[String]] |@| implicitly[Semigroup[List[Double]]])
    .imap(Foo.apply)(Function.unlift(Foo.unapply))
)
```

Fails with

```
<console>:23: error: value |@| is not a member of cats.Semigroup[String]
         (implicitly[Semigroup[String]] |@| implicitly[Semigroup[List[Double]]])
```

If I remove the following explicit "forwarding" of `InvariantMonoidal` instances in `Cartesian` companion object:

```
object Cartesian extends CartesianArityFunctions with AlgebraCartesianInstances

/**
 * Cartesian instances for types that are housed in Algebra and therefore
 * can't have instances for Cats type classes in their companion objects.
 */
private[cats] sealed trait AlgebraCartesianInstances {
  implicit val invariantSemigroup: Cartesian[Semigroup] = InvariantMonoidal.invariantMonoidalSemigroup
  implicit val invariantMonoid: Cartesian[Monoid] = InvariantMonoidal.invariantMonoidalMonoid
}
```

Here is the output from travis for reference:

- https://travis-ci.org/typelevel/cats/jobs/138068094
  • Loading branch information
OlivierBlanvillain committed Jun 16, 2016
1 parent aa2669b commit 07d2c14
Showing 1 changed file with 1 addition and 10 deletions.
11 changes: 1 addition & 10 deletions core/src/main/scala/cats/Cartesian.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,4 @@ import simulacrum.typeclass
def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
}

object Cartesian extends CartesianArityFunctions with AlgebraCartesianInstances

/**
* Cartesian instances for types that are housed in Algebra and therefore
* can't have instances for Cats type classes in their companion objects.
*/
private[cats] sealed trait AlgebraCartesianInstances {
implicit val catsInvariantSemigroup: Cartesian[Semigroup] = InvariantMonoidal.catsInvariantMonoidalSemigroup
implicit val catsInvariantMonoid: Cartesian[Monoid] = InvariantMonoidal.catsInvariantMonoidalMonoid
}
object Cartesian extends CartesianArityFunctions

0 comments on commit 07d2c14

Please sign in to comment.