在斯卡拉兹每个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。你必须添加'实例Applicative M,其中pure = return; (<*>)= ap'。我相信我看到了一些关于autoderiving超类的讨论,即实现'Monad'和'Functor'并隐式添加'Applicative',但尚未实现(再次AFAIK)。也许你可以编写一些模板Haskell来扫描当前monad实例并自动生成应用程序。不过,我不确定这是可能的。 – chi 2015-04-02 14:31:31