首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin箭头IO,IO.fx,IO!效果的差异

Kotlin箭头IO,IO.fx,IO!效果的差异
EN

Stack Overflow用户
提问于 2020-08-31 18:59:07
回答 1查看 439关注 0票数 1

我想在科特林用箭头

箭头有三种功能

代码语言:javascript
复制
IO {}
IO.fx {}
IO.fx { !effect}

我想知道这两者的区别。我知道IO.fx和IO.fx {!effect}帮助我们使用副作用,但是两者之间有什么区别,为什么我要使用一个而另一个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-31 20:08:39

虽然这种情况不久将发生变化,但在0.11.X版上:

  • IO { }是一个构造函数,它接受一个挂起函数,因此您可以调用内部的任何挂起函数。这是IO.effect { }

的捷径

代码语言:javascript
复制
suspend fun bla(): Unit = ...

fun myIO(): IO<Unit> = IO { bla() }

fun otherIO(): IO<Unit> = IO.effect { bla() }

  • IO.fx { }IO是一样的,只不过它添加了一些DSL函数,这些函数是其他IO API的快捷方式。最重要的是!bind,它在.

内部执行另一个IO。

代码语言:javascript
复制
fun myIO(): IO<Unit> = IO.fx { bla() }

fun nestIO(): IO<IO<Unit>> = IO.fx { myIO() }

fun unpackIO(): IO<Unit> = IO.fx { !myIO() }

它启用的另一个函数是从第一点开始的构造函数effect。因此,您实际上所做的是添加一层额外的包装,这可能是不必要的。

代码语言:javascript
复制
fun inefficientNestIO(): IO<IO<Unit>> = IO.fx { effect { bla() } }

fun inefficientUnpackedIO(): IO<Unit> = IO.fx { !effect { bla() } }

我们经常看到来自于支持渠道的人的inefficientUnpackedIO,它很容易被IO { bla() }所取代。

为什么在effectfx中有两种相同的方法呢?这是我们期待在下一个版本改进的东西。我们建议尽可能使用最不强大的抽象,所以只在使用其他IO-based API(如调度或并行化)时才保留-based。

代码语言:javascript
复制
IO.fx {
  val id = getUserIdSuspend()
  val friends: List<User> = 
    !parMapN(
      userFriends(id),
      IO { userProfile(id) },
      ::toUsers
    )
  !friends.parTraverse(IO.applicative()) { user ->
   IO { broadcastStatus(user) } 
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63676633

复制
相关文章

相似问题

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