首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同步上下文中使用arrow-kt中的IO组合

如何在同步上下文中使用arrow-kt中的IO组合
EN

Stack Overflow用户
提问于 2019-09-21 18:12:19
回答 2查看 232关注 0票数 1

我有以下接口:

代码语言:javascript
复制
interface UserRepository {
  fun role(codename: String): IO<Option<Role>>

  fun accessRights(roleId: Long): IO<List<AccessRight>>
}

现在尝试使用它来编写有效的this操作,如下所示:

代码语言:javascript
复制
private fun retrieveRole(roleCodename: String): IO<Option<RoleTo>> =
  IO.fx {
    val role = userRepository.role(roleCodename).bind()
    role.map { r ->
      val ar = userRepository.accessRights(r.id).bind()
      RoleTo.of(r, ar)
    }
  }

代码在第二次绑定(调用userRepository.accessRights(r.id).bind(),因为bind是挂起函数)时编译失败。我怎样才能正确地组合两个操作?我不明白为什么第一个绑定可以工作,但是第二个不能,我不想让我的函数挂起,或者我不得不这样做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-22 15:55:04

我能够使用traverseIO的应用实例来解决问题

代码语言:javascript
复制
private fun retrieveRole(roleCodename: String): IO<Option<RoleTo>> =
  IO.fx {
    val role = userRepository.role(roleCodename).bind()
    val accessRights = role.traverse(IO.applicative()) {
      userRepository.accessRights(it.id)
    }.bind()
    role.map2(accessRights) {
      (r, ar) -> RoleTo.of(r, ar)
    }
  }

感谢您指出map需要纯函数这一事实。

票数 1
EN

Stack Overflow用户

发布于 2019-09-22 06:16:00

这是一个常见的问题。如果你有Option<A>Either<E, A>,并且你想对它采取行动,你的第一反应是在块上使用它:

代码语言:javascript
复制
either.map { !someIO }

问题是没有覆盖left/none选项。您应该在两端都执行操作,并在执行IO之前将其提取出来。

代码语言:javascript
复制
!either.fold({ ioLogError(it) }, { someIo })

现在,从0.10开始,因为fold是一个内联函数,所以您也可以在其中使用!。我不能保证将来会是这种情况,因为这是我们为了方便而留下的一种意外的内联行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58039277

复制
相关文章

相似问题

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