我想知道是否有可能在列表或具有一元属性的类列表结构上实现类似于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使用可为null、option和eval的协程定义了类似的理解。我查看了实现及其效果文档,但我很难将概念转换为Lists。这在科特林可能吗?
目前不可能对List、Flow和其他发出多个值的非确定性数据结构实现monad理解。当前在Kotlin的continuations实现仅为单次。这意味着一个延续可以用一个发出的值来恢复一个程序。多次恢复程序需要用反射劫持延续堆栈标签,以便在第二次恢复时重播其状态。此外,重放多快照数据类型绑定的块将重放绑定之前的所有效果,因为该块必须再次发射。
list {
println("printed 3 times and not cool")
val a = listOf(1, 2, 3).bind()
a
}
arrow-continuations
库已经包括用于重置/移位的MultiShot定界范围,但它目前是内部的,因为在Kotlin暂停或继续提供不重播当前块的多镜头功能之前,它是不安全的。或者,我们需要real来进行理解,或者在其他代码之前使用类似的结构来强制绑定,这也可以解决块重放问题。
Effect接口最终委托给其中一个作用域来实现它。Reset.suspended
和Reset.restricted
的当前版本是单次发射的。