Kotlin 箭头 IO、IO.fx、IO !effect 之间的区别
Difference between Kotlin arrow IO, IO.fx, IO !effect
我正在尝试在 kotlin 中使用箭头
箭头具有三个功能
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() }
替代。
为什么在 effect
和 fx
中有两种相同的方法?这是我们希望在下一个版本中改进的东西。我们建议尽可能使用 最不强大的 抽象,因此仅在使用其他基于 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) }
}
}
我正在尝试在 kotlin 中使用箭头
箭头具有三个功能
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() }
替代。
为什么在 effect
和 fx
中有两种相同的方法?这是我们希望在下一个版本中改进的东西。我们建议尽可能使用 最不强大的 抽象,因此仅在使用其他基于 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) }
}
}