【发布时间】:2015-04-02 13:36:16
【问题描述】:
在 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 中,我必须一次又一次地为每个 Monad 提供一个 Applicative 实例。
是否可以避免这种重复性工作?
【问题讨论】:
-
暂时没有,AFAIK。您必须添加
instance Applicative M where pure=return; (<*>)=ap。我相信我看到了一些关于自动派生超类的讨论,即实现Monad和Functor并隐式添加了Applicative,但它尚未实现(再次,AFAIK)。也许您可以编写一些 Template Haskell 来扫描当前的 monad 实例并自动生成应用程序。不过,我不确定这是否可行。