gpt4 book ai didi

kotlin - Kotlin-倍数IO的组成

转载 作者:行者123 更新时间:2023-12-02 13:16:29 25 4
gpt4 key购买 nike

我是Kotlin的Arrow Framework的新手,我有两个问题:
让我们假设

fun getUser(id: Int): IO<Option<User>>
fun getCards(user: User): IO<List<Card>>


fun getUserAndCards(id: Int): IO<Option<Pair<User, List<Card>>>> = IO.fx {
when (val user = !userRepository.get(id)) {
is None -> None
is Some -> {
val cards = !cardRepository.get(user.t.id)
Some(Pair(user.t, cards))
}
}
}
如何以“箭头时尚”的方式实现相同的功能?
我设法得到:
fun getUserAndCards(id: Int): IO<Option<Pair<User, List<Card>>>> = IO.fx {
userRepository.get(id).bind().map { user ->
val cards = cardRepository.get(user.id).bind()
Pair(user, cards)
}
}
但是我在第二个 Suspension functions can be called only within coroutine body中获得了 bind()
编辑:
我看到 this post有相同的问题。在提供的答案中,它说问题是未涵盖“左/无”选项。但它涵盖了所有内容,将 map应用于 None时,有望获得 None

最佳答案

随着新的0.11.0版本即将发布,最惯用的方法是使用Arrow Fx Coroutines。
将示例重写为Arrow Fx协程将是:

suspend fun getUser(id: Int): Option<User>
suspend fun getCards(user: User): List<Card>


suspend fun getUserAndCards(id: Int): Option<Pair<User, List<Card>>> =
option {
val user = !userRepository.get(id)
val cards = !cardRepository.get(user.t.id)
Pair(user.t, cards)
}
现在,您可以在其中依靠 option { } DSL从 Option中提取值。

The problem is that the left/none option isn't covered. But IT IS covered, when applying map to a None it is expected to obtain a None.


您没错,它是正确的,但是 !是一个暂停函数,并且 map当前未内联,因此您不能在其中调用 !。在 0.11.0版本中,Arrow-Core中数据类型的运算符为 inline,以改善对 suspend函数的支持,这将解决 Suspension functions can be called only within coroutine body错误。
在其他功能语言中,例如Haskell monad转换器经常被使用( OptionT),但是在Kotlin中,使用 suspend更好地适合了它,并且与包装monad变形器相比还具有相当的性能优势。
如另一篇文章中所述,您也可以始终使用 traversesequence来翻转两个容器。 Option<IO<User>> -> IO<Option<User>>

关于kotlin - Kotlin-倍数IO的组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63433207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com