我可以自动实现课程吗?

Zhe*_*lov 9 haskell scalaz

在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!
Run Code Online (Sandbox Code Playgroud)

另一个例子:Arrow是自动的Profunctor.

但是,在Haskell中,我必须Applicative一次Monad又一次地提供一个实例.

有可能避免这种重复性的工作吗?

Dan*_*ner 2

目前还不可能,但如果您更改现有库来支持这一点,则可能会实现。打开 DefaultSignatures 可以让你写

class Applicative f where
    pure :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b

    default pure :: Monad f => a -> f a
    default (<*>) :: Monad f => f (a -> b) -> f a -> f b
    pure = return
    (<*>) = ap
Run Code Online (Sandbox Code Playgroud)

然后,一旦您实现了instance Monad M where {- ... -},一个简单的instance Applicative M(没有where或 方法定义)将继承这些默认实现。我不知道为什么没有这样做。