class MonadLaws[F[_] : Monad : Runnable] {
import syntax._
def leftIdentity[A](a: => A, f: A => F[A]): Boolean = {
Cat(a).flatMap(f).run() == f(a).run()
}
def rightIdentity[A](m: F[A]): Boolean = {
m.run() == m.flatMap(a => Cat(a)).run()
}
def associativity[A](m: F[A], f: A => F[A], g: A => F[A]): Boolean = {
val combined = (x: A) => f(x).flatMap(g)
m.flatMap(f).flatMap(g).run() == m.flatMap(combined).run()
}
}