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



我正在尝试在kotlin 中使用箭头

Arrow有三个功能

IO {}
IO.fx {}
IO.fx { !effect}

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

虽然这很快就会改变,但在0.11.X:版本上

  • IO { }是一个接受挂起函数的构造函数,因此您可以调用其中的任何挂起函数。这是IO.effect { }的快捷方式
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
fun myIO(): IO<Unit> = IO.fx { bla() }
fun nestIO(): IO<IO<Unit>> = IO.fx { myIO() }
fun unpackIO(): IO<Unit> = IO.fx { !myIO() }

它启用的另一个函数是构造函数effect。因此,你有效地做的是添加一层可能不必要的额外包装。

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

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

为什么在effectfx中有两种相同的方法?这是我们希望在下一个版本中改进的地方。我们建议尽可能使用功能最低的抽象,因此只有在使用其他基于IO的API(如调度或并行化(时才保留fx

IO.fx {
val id = getUserIdSuspend()
val friends: List<User> = 
!parMapN(
userFriends(id),
IO { userProfile(id) },
::toUsers
)
!friends.parTraverse(IO.applicative()) { user ->
IO { broadcastStatus(user) } 
}
}

相关内容

  • 没有找到相关文章

最新更新