In Scalaz every Monad
instance is automatically an instance of Applicative
.
implicit val listInstance = new Monad[List] {
def point[A](a: => A) = List(a)
def bind[A, B](fa: List[A])(f: A => List[B]) = fa flatMap f
}
List(2) <*> List((x: Int) => x + 1) // Works!
Another example: Arrow
is automatically a Profunctor
.
However, in Haskell I must provide an instance of Applicative
for every Monad
again and again.
Is it possible to avoid this repetitive job?