Leg*_*ter 1 functional-programming kotlin arrow-kt
我正在尝试在 kotlin 中使用箭头
箭头具有三个功能
IO {}
IO.fx {}
IO.fx { !effect}
Run Code Online (Sandbox Code Playgroud)
我想知道这两者的区别。我知道 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() }
Run Code Online (Sandbox Code Playgroud)
IO.fx { }是一样的IO,除了它补充说,对于IO的其他API快捷方式的几个DSL功能。最重要的是!or bind,它在内部执行另一个 IO。fun myIO(): IO<Unit> = IO.fx { bla() }
fun nestIO(): IO<IO<Unit>> = IO.fx { myIO() }
fun unpackIO(): IO<Unit> = IO.fx { !myIO() }
Run Code Online (Sandbox Code Playgroud)
它启用的另一个功能是effect从第一点开始的构造函数。因此,您正在有效地做的是添加额外的包装层,这可能不是必需的。
fun inefficientNestIO(): IO<IO<Unit>> = IO.fx { effect { bla() } }
fun inefficientUnpackedIO(): IO<Unit> = IO.fx { !effect { bla() } }
Run Code Online (Sandbox Code Playgroud)
我们经常inefficientUnpackedIO从访问支持渠道的人那里看到,它很容易被替换为IO { bla() }.
为什么在effectand 中有两种方法可以做同样的事情fx?这是我们希望在下一个版本中改进的东西。我们建议尽可能使用最不强大的抽象,因此fx仅在使用其他IO基于 API 的 API(例如调度或并行化)时才保留。
IO.fx {
val id = getUserIdSuspend()
val friends: List<User> =
!parMapN(
userFriends(id),
IO { userProfile(id) },
::toUsers
)
!friends.parTraverse(IO.applicative()) { user ->
IO { broadcastStatus(user) }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |