在斯卡拉茲每個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