kotlin - 使用协程在 kotlin 中的列表上实现 monad 理解
问题描述
我想知道是否可以在具有单子属性的列表或类似列表的结构上实现类似于 Kotlin 中 Haskell 的 do-notation 的东西。
举个例子:
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 使用协程为nullable、option 和 eval定义了类似的理解。我查看了实现及其效果文档,但我无法将概念转换为列表。这在 kotlin 中是否可行?
解决方案
目前不可能实现对 List、Flow 和其他发出多个值的非确定性数据结构的 monad 理解。当前在 Kotlin 中的延续实现只是单一的。这意味着延续可以使用单个发出的值来恢复程序。多次恢复程序需要使用反射劫持延续堆栈标签,以便在第二次恢复时重放它们的状态。此外,重播绑定了多重数据类型的块将重播绑定之前的所有效果,因为该块必须再次发射。
list {
println("printed 3 times and not cool")
val a = listOf(1, 2, 3).bind()
a
}
该arrow-continuations
库已经包含一个用于重置/移位的 MultiShot 定界范围,但它目前是内部的,因为在 Kotlin 暂停或延续提供在不重播当前块的情况下进行多重处理的能力之前,它是不安全的。或者,我们需要真正的理解或类似的结构来强制绑定发生在其他代码之前,这也将解决块重放问题。
Effect 接口最终委托给这些作用域之一来实现它。Reset.suspended
和的当前版本Reset.restricted
是单发的。
推荐阅读
- mysql - ASP.NET MVC validate query from controller to ajax
- android - 通过互联网移动带有安卓设备的机器人
- php - Access parent scope from nested class
- ruby-on-rails - Ruby Rails:保存 JSON 并将其解析回视图中的布尔值
- php - 如何更改模态窗口的标题?
- c# - Web API 设计问题 - 阻止用户使用 PUT/PATCH 更新用户 ID
- excel - VBA cells.find返回值而不是地址
- java - Java中finalize方法的问题
- azure - 如何监视 Azure Functions 异常
- excel - 根据事先未知的值为单元格标题着色