Just curious why Applicative requires it's own type trait, when everything can be implemented in terms of Functor. Here's an alternative implementation of the Applicative builder....
object Applicative {
implicit def makeBuilder[F[_]:Functor,A](m: F[A]) = new ApplicativeBuilder[F,A](m)
def apply[F[_]:Functor, A](m: F[A]) = makeBuilder(m)
}
class ApplicativeBuilder[F[_],A](ma: F[A])(implicit functor: Functor[F]) {
def <*>[B](mb: F[B]) = new ApplicativeBuilder2(mb)
class ApplicativeBuilder2[B](mb: F[B]) {
import Implicits._
def apply[C](f: (A, B) => C): F[C] = mb.fmap(ma.map(f.curried))
def <*>[C](mc: F[C]) = new AppplicativeBuilder3[C](mc)
class AppplicativeBuilder3[C](mc: F[C]) {
def apply[D](f: (A,B,C) => D): F[D] = mc.fmap(mb.fmap(ma.map(f.curried)))
def <*>[D](md: F[D]) = new ApplicativeBuilder4[D](md)
class ApplicativeBuilder4[D](md: F[D]) {
def apply[E](f: (A,B,C,D) => E): F[E] = md.fmap(mc.fmap(mb.fmap(ma.map(f.curried))))
def <*>[E](me: F[E]) = new ApplicativeBuilder5[E](me)
class ApplicativeBuilder5[E](me: F[E]) {
def apply[R](f: (A,B,C,D,E) => R): F[R] = me.fmap(md.fmap(mc.fmap(mb.fmap(ma.map(f.curried)))))
}
}
}
}
}
Of course, I could be completely missing the point of the Applic type trait vs. using <*> for applicative style...