在斯卡拉兹每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 中我必须提供一个实例Applicative
对于每一个Monad
一次又一次。
是否可以避免这种重复性的工作呢?
当有两个地方可以派生时就会出现问题Applicative
实例。例如,假设m
是类型a b
where Arrow a
。然后有一个明显的例子Applicative
也从这个定义来看。编译器应该使用哪一个?当然,结果应该是一样的,但 Haskell 无法检查这一点。通过让我们写出实例,Haskell 至少迫使我们思考定义的一致性。
如果你想要的话,这里有WrappedMonad
班级在Control.Applicative
,它为所有明显的实例提供了newtype
包装器,但使用WrapMonad
and unwrapMonad
一直也没有那么有吸引力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)