In Scalaz ogni istanza Monad
è automaticamente un'istanza di Applicative
.Posso implementare automaticamente le classi?
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!
Un altro esempio: Arrow
è automaticamente un Profunctor
.
Tuttavia, in Haskell devo fornire un'istanza di Applicative
per ogni Monad
ancora e ancora.
È possibile evitare questo lavoro ripetitivo?
Non al momento, AFAIK. Devi aggiungere istanza applicativa M dove pure = return; (<*>) = ap'. Credo di aver visto alcune discussioni sulle superclassi di conversione automatica, cioè implementare 'Monad' e' Functor' e avere 'Applicative' implicitamente aggiunto, ma non è stato implementato (di nuovo, AFAIK). Forse puoi scrivere alcuni Template Haskell per scansionare le istanze monade correnti e generare applicazioni auto-generanti. Non sono sicuro che sia possibile, comunque. – chi