Kotlin-多重IO的合成

Kotlin-多重IO的合成,kotlin,concurrency,functional-programming,arrow-kt,Kotlin,Concurrency,Functional Programming,Arrow Kt,我不熟悉Kotlin的Arrow框架,我有几个问题: 让我们假设 fun getUser(id:Int):IO 趣味卡(用户:用户):IO 趣味getUserAndCards(id:Int):IO=IO.fx{ 何时(val user=!userRepository.get(id)){ 是无->无 是一些->{ val cards=!cardRepository.get(user.t.id) 一些(成对(user.t、卡片)) } } } 如何以“箭头式”的方式实现相同的功能 我设法得到: 乐

我不熟悉Kotlin的Arrow框架,我有几个问题:

让我们假设

fun getUser(id:Int):IO
趣味卡(用户:用户):IO
趣味getUserAndCards(id:Int):IO=IO.fx{
何时(val user=!userRepository.get(id)){
是无->无
是一些->{
val cards=!cardRepository.get(user.t.id)
一些(成对(user.t、卡片))
}
}
}
如何以“箭头式”的方式实现相同的功能

我设法得到:

乐趣getUserAndCards(id:Int):IO=IO.fx{ userRepository.get(id).bind().map{user-> val cards=cardRepository.get(user.id).bind() 配对(用户、卡) } } 但是我获得的
挂起函数只能在第二个
bind()
中的coroutine body中调用

编辑
我也看到了同样的问题。在提供的答案中,它说问题在于没有包括left/none选项。但是,当将
map
应用于
None
时,预计将获得
None
,随着新的0.11.0版本即将发布,最惯用的方法将是使用Arrow-Fx协程

将示例重写为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)
  }
suspend-fun-getUser(id:Int):选项
挂起趣味卡(用户:用户):列表
挂起有趣的getUserAndCards(id:Int):选项=
选择权{
val user=!userRepository.get(id)
val cards=!cardRepository.get(user.t.id)
配对(user.t、cards)
}
您现在可以依靠
选项{}
DSL从
选项
中提取值

问题是没有包括left/none选项。但它是覆盖的,当将map应用于None时,它将获得一个None

你是对的,它被覆盖了,但是
是一个挂起函数,
map
当前未内联,因此不允许调用
内部。在
0.11.0
中,释放箭头核心中数据类型的运算符为
inline
,以改进对
suspend
函数的支持,这将解决
suspend函数只能在coroutine body内调用的问题
错误

在其他函数式语言中,如Haskell monad transformers,经常使用(
OptionT
),但在Kotlin中,使用
suspend
是一种更好的选择,与包装monad Transformer相比,它还具有相当多的性能优势


正如在另一篇文章中提到的,您也可以始终使用
遍历
序列
来翻转两个容器<代码>选项->IO

期待箭头0.11:)