有没有办法在 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 元素(例如 EitherNullable)的数据类型构建综合,但不能像 Flow 这样的 0..NList 数据类型。