我想知道是否有可能在列表或具有一元属性的类列表结构上实现类似于Kotlin中Haskell的do-表示法。
以以下为例:
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使用任一种,可空的,选项和eval的协同线定义了类似的理解。我查看了实现以及它的效果文件,但是我很难将这个概念转换为列表。这在科特林有可能吗?
发布于 2021-04-14 08:18:11
目前还不可能对发出多个值的列表、流和其他不确定的数据结构实现单一理解。目前在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的当前版本都是一次性的。
https://stackoverflow.com/questions/67084114
复制相似问题