package scalaz

object Prod {
  def ProdApplicative[M[_] : Applicative, N[_] : Applicative]: Applicative[({type λ[α]=(M[α], N[α])})] = new Applicative[({type λ[α]=(M[α], N[α])})] {
    import Scalaz._

    def pure[A](a: => A) = (a.η[M], a.η[N])

    override def apply[A, B](f: (M[A => B], N[A => B]), a: (M[A], N[A])) = {
      lazy val fv = f
      lazy val av = a
      (av._1 <*> fv._1, av._2 <*> fv._2)
    }
  }
}