In Scalaz ist jede Monad
Instanz automatisch eine Instanz von Applicative
.Kann ich Klassen automatisch implementieren?
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!
Ein weiteres Beispiel: Arrow
ist automatisch ein Profunctor
.
Allerdings muss ich in Haskell immer wieder eine Instanz von Applicative
für jede Monad
bereitstellen.
Ist es möglich, diesen sich wiederholenden Job zu vermeiden?
Nicht im Moment, AFAIK. Sie müssen 'Instanz Applicative M hinzufügen, wobei pure = return; (<*>) = ap'. Ich glaube, ich sah eine Diskussion über das automatische Ablegen von Superklassen, d. H. Implementieren von 'Monad' und' Functor' und das Hinzufügen von 'Applicative' implizit, aber es wurde nicht implementiert (wieder, AFAIK). Vielleicht können Sie Template Haskell schreiben, um die aktuellen Monad-Instanzen zu scannen und Anwendungen automatisch zu generieren. Ich bin mir nicht sicher, ob das möglich ist. – chi