[英]Stacking Monad Transformers in scala
我试图以一种haskell方式堆叠scalaz
monad scalaz
:
statyReader :: (MonadReader Int m, MonadState Int m) => m Int
斯卡拉:
def statyReader[F[_]](implicit r: MonadReader[F, Int], s: MonadState[F, Int]): F[Int] = for {
counter <- s.get
secret <- r.ask
_ <- s.put(counter + secret)
} yield counter
它用1隐式传递编译,但不用2:
Error:(13, 18) value flatMap is not a member of type parameter F[Int]
counter <- s.get
^
Error:(14, 18) value flatMap is not a member of type parameter F[Int]
secret <- r.ask
^
Error:(15, 21) value map is not a member of type parameter F[Unit]
_ <- s.put(counter + secret)
^
为什么会这样? 我的猜测是编译器现在混淆了它应该选择的“ F[_]
”的monadic实例(MonadReader和MonadState都扩展了Monad[F[_]
)。 这是一个正确的猜测吗?
怎么克服这个?
这不是一个真正的答案,但也许有点帮助。
我想你是正确的; 似乎编译器无法统一两个参数的F[_]
类型(我猜因为它是具有多个可能实例而不是具体类型实例的高级类型)到monad类型。 编译使用单独的参数列表,因为类型统一仅在参数列表中发生。 它可以进一步说明如下:
def statyReader[F[_]](implicit r: MonadReader[F, Int], s: MonadState[F, Int]): F[Int] =
statyReader2(r, s)
def statyReader2[F[_]:Monad](r: MonadReader[F, Int], s: MonadState[F, Int]): F[Int] =
for {
counter <- s.get
secret <- r.ask
_ <- s.put(counter + secret)
} yield counter
Error: ambiguous implicit values: both
value s of type scalaz.MonadState[F,Int] and
value r of type scalaz.MonadReader[F,Int]
match expected type scalaz.Monad[F]
显然,作为一种解决方法,您可以使用两个参数列表来选择要使用的monad:
def statyReader[F[_]](implicit r: MonadReader[F, Int], s: MonadState[F, Int]): F[Int] =
statyReader2(r)(s)
def statyReader2[F[_]](r: MonadReader[F, Int])(implicit s: MonadState[F, Int]): F[Int] =
for {
counter <- s.get
secret <- r.ask
_ <- s.put(counter + secret)
} yield counter
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.