使用协程在 kotlin 中的列表上实现 monad 理解
implement a monad comprehension on a list in kotlin using a coroutine
我想知道是否有可能在 Kotlin 中对列表或具有单子属性的类列表结构实现类似于 Haskell 的符号。
举个例子:
fun <A, B> cartesianProduct(xs: List<A>, ys: List<B>): List<Pair<A, B>> =
xs.flatMap { x -> ys.flatMap { y -> listOf(x to y) } }
要是能写点类似的就好了
suspend fun <A, B> cartesianProduct(xs: List<A>, ys: List<B>): List<Pair<A, B>> =
list {
val x = xs.bind()
val y = xs.bind()
yield(x to y)
}
Arrow-Kt 使用协程为 either, nullable, option and eval. I looked at the implementation and also its Effect documentation 定义了类似的理解,但我很难将这个概念转换为列表。这在科特林中甚至可能吗?
目前无法对 List、Flow 和其他发出多个值的非确定性数据结构实施 monad 理解。目前在 Kotlin 中延续的实现只是单次的。这意味着延续可以恢复具有单个发射值的程序。多次恢复程序需要用反射劫持连续堆栈标签,以便在第二次恢复时重放它们的状态。此外,重放绑定了多重数据类型的块将重放绑定之前的所有效果,因为该块必须再次发射。
list {
println("printed 3 times and not cool")
val a = listOf(1, 2, 3).bind()
a
}
arrow-continuations
库已经包含一个 MultiShot delimited scope for reset/shift 但它目前是内部的,因为在 Kotlin 暂停或延续提供多重射击能力而不重播当前块之前它是不安全的。或者,我们需要真正的理解或类似的结构来强制绑定发生在其他代码之前,这也将解决块重放问题。
Effect 接口最终将其实现委托给这些范围之一。 Reset.suspended
和Reset.restricted
的当前版本是单发的。
我想知道是否有可能在 Kotlin 中对列表或具有单子属性的类列表结构实现类似于 Haskell 的符号。
举个例子:
fun <A, B> cartesianProduct(xs: List<A>, ys: List<B>): List<Pair<A, B>> =
xs.flatMap { x -> ys.flatMap { y -> listOf(x to y) } }
要是能写点类似的就好了
suspend fun <A, B> cartesianProduct(xs: List<A>, ys: List<B>): List<Pair<A, B>> =
list {
val x = xs.bind()
val y = xs.bind()
yield(x to y)
}
Arrow-Kt 使用协程为 either, nullable, option and eval. I looked at the implementation and also its Effect documentation 定义了类似的理解,但我很难将这个概念转换为列表。这在科特林中甚至可能吗?
目前无法对 List、Flow 和其他发出多个值的非确定性数据结构实施 monad 理解。目前在 Kotlin 中延续的实现只是单次的。这意味着延续可以恢复具有单个发射值的程序。多次恢复程序需要用反射劫持连续堆栈标签,以便在第二次恢复时重放它们的状态。此外,重放绑定了多重数据类型的块将重放绑定之前的所有效果,因为该块必须再次发射。
list {
println("printed 3 times and not cool")
val a = listOf(1, 2, 3).bind()
a
}
arrow-continuations
库已经包含一个 MultiShot delimited scope for reset/shift 但它目前是内部的,因为在 Kotlin 暂停或延续提供多重射击能力而不重播当前块之前它是不安全的。或者,我们需要真正的理解或类似的结构来强制绑定发生在其他代码之前,这也将解决块重放问题。
Effect 接口最终将其实现委托给这些范围之一。 Reset.suspended
和Reset.restricted
的当前版本是单发的。