В Scalaz каждый Monad
экземпляр автоматически является экземпляром 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!
Другой пример: Arrow
автоматически является Profunctor
.
Однако в Haskell я должен предоставить экземпляр Applicative
за каждые Monad
снова и снова.
Можно ли избежать этой повторяющейся работы?
В настоящее время, AFAIK. Вы должны добавить 'instance Applicative M, где pure = return; (<*>) = ap'. Я считаю, что я видел некоторую дискуссию об автокодирующих суперклассах, т. Е. Реализовал «Monad» и «Functor» и неявно добавил «Applicative», но он не был реализован (опять же, AFAIK). Возможно, вы можете написать шаблон Template Haskell для сканирования текущих экземпляров монады и автоматических аппликаций. Я не уверен, что это возможно. – chi