加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何处理读者[A,未来[B]]

发布时间:2020-12-16 18:34:25 所属栏目:安全 来源:网络整理
导读:鉴于以下3个功能, def f[A,B] : Reader[A,B] = ???def g[A,B,C](b: B) : Reader[A,Future[C]] = ???def h[A,C,D](c: C) : Reader[A,D] = ??? 如何写一个monadic组合器? 这是我目前的解决方案,但我并不满意所有这些样板 def f2[A,B] : ReaderT[Future,A,B] =
鉴于以下3个功能,

def f[A,B] : Reader[A,B] = ???
def g[A,B,C](b: B) : Reader[A,Future[C]] = ???
def h[A,C,D](c: C) : Reader[A,D] = ???

如何写一个monadic组合器?

这是我目前的解决方案,但我并不满意所有这些样板

def f2[A,B] : ReaderT[Future,A,B] = kleisli {
  a => Future.successful(f.run(a))
}

def h2[A,D](c: C) : ReaderT[Future,D] = kleisli {
  a => Future.successful(h(c).run(a))
}

def g2[A,C](b: B) : ReaderT[Future,C] = kleisli {
  a => g(b).run(a)
}

def i[A,D] : ReaderT[Future,(B,D)] =
  for {
    b <- f2[A,B]
    c <- g2[A,C](b)
    d <- h2[A,D](c)
  } yield (b,c,d)

解决方法

def i[A,D)] =
  for {
    b <- f[A,B].lift[Future]
    c <- g[A,C](b).mapK[Future,C](identity)
    d <- h[A,D](c).lift[Future]
  } yield (b,d)

我不确定是否有更好的方法来替换mapK [Future,C](身份).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读