首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在scala中堆叠Monad Transformers

在scala中堆叠Monad Transformers
EN

Stack Overflow用户
提问于 2016-07-22 00:10:52
回答 1查看 258关注 0票数 7

我正在尝试以一种haskell的方式堆叠scalaz的monad转换器:

代码语言:javascript
复制
statyReader :: (MonadReader Int m, MonadState Int m) => m Int

scala:

代码语言:javascript
复制
  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个参数:

代码语言:javascript
复制
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[_]的一元实例”( MonadReader和MonadState都扩展了Monad[F[_])。这是一个正确的猜测吗?

如何克服这一点?

EN

回答 1

Stack Overflow用户

发布于 2016-07-22 21:44:33

这不是一个真正的答案,但可能会有一点帮助。

我认为您是对的;编译器似乎无法将这两个参数的F[_]类型(我猜是因为它是具有多个可能实例的高级类型,而不是具体类型实例)统一为monad类型。编译使用单独的参数列表,因为类型统一只发生在参数列表中。它可以像这样进一步说明:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38509236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档