在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又一次地提供一个实例.
有可能避免这种重复性的工作吗?
目前还不可能,但如果您更改现有库来支持这一点,则可能会实现。打开 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或 方法定义)将继承这些默认实现。我不知道为什么没有这样做。
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |