Usually you can just put your instance in scope and do it (you can clear it a bit by importing cats.instances.all._, but I will be clearer for clarity):
import cats.instances.int._
import cats.instances.list._
import cats.instances.map._
import cats.instances.string._
import cats.instances.tuple._
import cats.laws.discipline.MonadTests
import cats.laws.discipline.eq._
MonadTests[FUN].monad[Int, Int, Int].all.check
Isomorphisms , Invariant, Monad. , Eq - Eq Function1, .
Invariant, ( SI-2712, - - . ), , , . - Isomorphisms:
import cats.laws.discipline.CartesianTests.Isomorphisms
implicit val funIsomorphisms: Isomorphisms[FUN] = Isomorphisms.invariant(funMonad)
( 0.7.2):
import cats.Monad
import cats.instances.int._
import cats.instances.list._
import cats.instances.map._
import cats.instances.string._
import cats.instances.tuple._
import cats.instances.map._
import cats.laws.discipline.CartesianTests.Isomorphisms
import cats.laws.discipline.MonadTests
import cats.laws.discipline.eq._
type FUN[A] = Map[String, String] => (List[String], A)
val funMonad: Monad[FUN] = new Monad[FUN] {
def flatMap[A, B](fa: FUN[A])(f: (A) => FUN[B]): FUN[B] = m => {
val (list1, a1) = fa(m)
val (list2, a2) = f(a1)(m)
(list1 ++ list2, a2)
}
def pure[A](x: A): FUN[A] = m => (Nil, x)
def tailRecM[A, B](a: A)(f: A => FUN[Either[A, B]]): FUN[B] = defaultTailRecM(a)(f)
}
implicit val funIsomorphisms: Isomorphisms[FUN] = Isomorphisms.invariant(funMonad)
:
scala> MonadTests[FUN](funMonad).monad[Int, Int, Int].all.check
+ monad.ap consistent with product + map: OK, passed 100 tests.
+ monad.applicative homomorphism: OK, passed 100 tests.
+ monad.applicative identity: OK, passed 100 tests.
+ monad.applicative interchange: OK, passed 100 tests.
+ monad.applicative map: OK, passed 100 tests.
+ monad.apply composition: OK, passed 100 tests.
+ monad.cartesian associativity: OK, passed 100 tests.
+ monad.covariant composition: OK, passed 100 tests.
+ monad.covariant identity: OK, passed 100 tests.
+ monad.flatMap associativity: OK, passed 100 tests.
+ monad.flatMap consistent apply: OK, passed 100 tests.
+ monad.followedBy consistent flatMap: OK, passed 100 tests.
+ monad.invariant composition: OK, passed 100 tests.
+ monad.invariant identity: OK, passed 100 tests.
+ monad.map flatMap coherence: OK, passed 100 tests.
+ monad.monad left identity: OK, passed 100 tests.
+ monad.monad right identity: OK, passed 100 tests.
+ monad.monoidal left identity: OK, passed 100 tests.
+ monad.monoidal right identity: OK, passed 100 tests.
+ monad.mproduct consistent flatMap: OK, passed 100 tests.
+ monad.tailRecM consistent flatMap: OK, passed 100 tests.
( checkAll - .all.check, , ScalaTest FunSuite.)