Kotlin-多重IO的合成
我不熟悉Kotlin的Arrow框架,我有几个问题: 让我们假设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、卡片)) } } } 如何以“箭头式”的方式实现相同的功能 我设法得到: 乐
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:)