有没有办法在 Kotlin Flow 中使用 monad 理解
Is there a way to use monad comprehensions with Kotlin Flow
Kotlin 协程和 Arrow 是避免嵌套平面图的好方法,在 Kotlin 中引入了单子理解。然而,Kotlin 的 Flow
类型仍然依赖于声明式平面映射,因此我们混合使用了直接样式和声明式样式:
override suspend fun findAll(page: Pageable): Either<BusinessException, Flow<PageElement<ClientOut>>> = either {
val count = clientRepository.count().awaitSingle().bind()
return clientRepository.findByIdNotNull(page).asFlow()
.flatMapMerge { client ->
flow { emit(mapDetailedClientOut(client)) }
}
}
val count
已绑定在 either {...}
理解中。然而,似乎没有办法对 Flow
做同样的事情,迫使我们嵌套 flatmapMerge()
.
有没有办法做到这一点,或者是否计划在不久的将来以某种方式包含在内?
遗憾的是,目前无法为 KotlinX Flow
数据类型构建综合,因为 Kotlin 中的协程仅支持 single-shot emission/bind
.
因此,只能为具有 0..1
元素(例如 Either
或 Nullable
)的数据类型构建综合,但不能像 Flow
这样的 0..N
或 List
数据类型。
Kotlin 协程和 Arrow 是避免嵌套平面图的好方法,在 Kotlin 中引入了单子理解。然而,Kotlin 的 Flow
类型仍然依赖于声明式平面映射,因此我们混合使用了直接样式和声明式样式:
override suspend fun findAll(page: Pageable): Either<BusinessException, Flow<PageElement<ClientOut>>> = either {
val count = clientRepository.count().awaitSingle().bind()
return clientRepository.findByIdNotNull(page).asFlow()
.flatMapMerge { client ->
flow { emit(mapDetailedClientOut(client)) }
}
}
val count
已绑定在 either {...}
理解中。然而,似乎没有办法对 Flow
做同样的事情,迫使我们嵌套 flatmapMerge()
.
有没有办法做到这一点,或者是否计划在不久的将来以某种方式包含在内?
遗憾的是,目前无法为 KotlinX Flow
数据类型构建综合,因为 Kotlin 中的协程仅支持 single-shot emission/bind
.
因此,只能为具有 0..1
元素(例如 Either
或 Nullable
)的数据类型构建综合,但不能像 Flow
这样的 0..N
或 List
数据类型。