package com.zibaldone.cats
package hierarchy

trait Monad[F[_]] extends Applicative[F] with FlatMap[F]:

  override def map[A, B](fa: F[A])(f: A => B): F[B]         = flatMap(fa)(a => pure(f(a)))
  override def product[A, B](fa: F[A], fb: F[B]): F[(A, B)] = flatMap(fa)(a => map(fb)(b => (a, b)))