Skip to content

SplitLaw doesn't hold in general #1567

Closed
@peterneyens

Description

@peterneyens

When you run our current SplitLaw for Kleisli[Either[String, ?], ?, ?] it fails the splitInterchange law.
@fthomas already mentioned in #232 that he wasn't sure that it was sound.

If you add the following to KleisliTests you can see it fail.

{
  type StringOr[A] = Either[String, A]
  
  // SI 2712 workarounds
  implicit val EqFAA     = implicitly[Eq[Kleisli[StringOr,Int,Int]]]
  implicit val EqFACB    = implicitly[Eq[Kleisli[StringOr,(Int, Int),Int]]]
  implicit val EqFACBC   = implicitly[Eq[Kleisli[StringOr,(Int, Int),(Int, Int)]]]
  implicit val EqFACDBCD = implicitly[Eq[Kleisli[StringOr,((Int, Int), Int),(Int, (Int, Int))]]]
  
  implicit val invariant = Kleisli.catsDataFunctorForKleisli[StringOr, Int]
  implicit val iso = CartesianTests.Isomorphisms.invariant[Kleisli[StringOr, Int, ?]]
  
  implicit val ArbFAB = implicitly[org.scalacheck.Arbitrary[Kleisli[StringOr,Int,Int]]]
  
  implicit val catsDataArrowForKleisli = Kleisli.catsDataSplitForKleisli[StringOr]
  checkAll("Kleisli[Either[String, ?], Int, Int]", SplitTests[Kleisli[StringOr, ?, ?]].split[Int, Int, Int, Int, Int, Int])
}

I looked at it with @diesalbla and the law only seems to hold for commutative arrows.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions