首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用协同线在kotlin中实现对列表的单一理解

使用协同线在kotlin中实现对列表的单一理解
EN

Stack Overflow用户
提问于 2021-04-14 00:50:18
回答 1查看 448关注 0票数 7

我想知道是否有可能在列表或具有一元属性的类列表结构上实现类似于Kotlin中Haskell的do-表示法。

以以下为例:

代码语言:javascript
复制
fun <A, B> cartesianProduct(xs: List<A>, ys: List<B>): List<Pair<A, B>> =
  xs.flatMap { x -> ys.flatMap { y -> listOf(x to y) } }

如果我能写这样的东西就好了

代码语言:javascript
复制
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的协同线定义了类似的理解。我查看了实现以及它的效果文件,但是我很难将这个概念转换为列表。这在科特林有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 08:18:11

目前还不可能对发出多个值的列表、流和其他不确定的数据结构实现单一理解。目前在Kotlin中继续的实现只是一次尝试。这意味着一个连续可以用一个发出的值恢复一个程序。多次恢复程序需要劫持带有反射的连续堆栈标签,以便在第二次恢复中重放它们的状态。此外,重播一个多镜头数据类型绑定的块将重播绑定之前的所有效果,因为该块必须再次发出。

代码语言:javascript
复制
list {
  println("printed 3 times and not cool")
  val a = listOf(1, 2, 3).bind()
  a
}

arrow-continuations库已经包含了一个MultiShot分隔范围用于重置/移位,但是它目前是内部的,因为在Kotlin暂停或连续提供了不重播当前块的多镜头功能之前,它是不安全的。或者,我们需要真正的理解或类似的结构来强制绑定发生在其他代码之前,这也将解决块重放问题。

Effect接口最终为其实现委托给这些作用域之一。Reset.suspendedReset.restricted的当前版本都是一次性的。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67084114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档