首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrow-Kt Fx vs Kotlin Coroutines

Arrow-Kt Fx vs Kotlin Coroutines
EN

Stack Overflow用户
提问于 2020-02-13 05:24:48
回答 2查看 1.2K关注 0票数 3

我正努力学习Arrow-Kt,因为我对Functional Programming in Kotlin很好奇。

有人能解释为什么需要创建一个功能几乎类似于Kotlin Coroutines的构造吗?还是我对这件事的理解错了?

这两个是怎么绑在一起的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-13 09:16:22

新答案

这个答案已经很老了,已经非常过时了。因此,我想更新这个问题,以反映目前的情况。在更新Arrow的时候,版本是1.1.2,但这很可能在将来不再改变。

Arrow Fx 使用实现自己的运行时,但这与围绕KotlinX Coroutines构建的现有生态系统产生了很大摩擦。因此,我们不再继续自定义运行时的工作,而是在KotlinX Coroutines之上重新实现了Arrow的所有API,并提供了所有现有的保证和测试套件。有效地证明KotlinX协同服务可以支持功能效果系统,就像我们在中定义的那样。

因此,现在Arrow完全建立在KotlinX协同服务的基础上,并因此坚持其所有原则,如结构化并发。

它不再有IO类型,但是Arrow改变了它的方向,完全支持和接受suspend () -> A (以及我们认为它在性能和语法上都优于suspend CoroutineScope.() -> A )。

从那时起,Arrow将大部分精力投入到构建与suspend协同工作的一元DSL上,这样您就可以更容易地创建复杂的工作流并混合Eithersuspend等的关注点,而不需要复杂的抽象或困难的理论。例如:

代码语言:javascript
复制
object MyError
object User

suspend fun fetchUser(): Either<MyError, User> =
    User.right()

suspend fun example(): Either<MyError, List<User>> = either {
  delay(10_000) // suspending sleep
  (0..10).parTraverse(Dispatchers.IO) { // parallel map on IO
    user().bind() // get `User` out of Either<E, User>
  }
}

正如您在上面看到的,我们可以很容易地将并行性、并发性和一元运算的力量以Kotlin惯用的方式结合起来。

因此,Arrow Fx和Kotlin/KotlinX Coroutines现在似乎在一起工作,您可以根据需要混合和匹配代码。

Arrow旨在提供一些更高级的操作人员,除了KotlinX协同服务,以及其他Arrow库,如Arrow,旨在以同样的方式补充语言和生态系统。

旧员额

Arrow在处理IO时使用协同机制,而不是替换它们。类似于Room具有允许使用流的扩展。

这是不正确的,Arrow Fx为Kotlin的挂起系统构建了一个纯功能运行时库。就像KotlinX库一样,Coroutines为Kotlin的库构建运行时库。

因此,这两个库都为Kotlin的挂起系统提供了一个实现,并且可以根据您的需要或用例进行交互或独立使用。

Arrow Fx为Kotlin的挂起系统提供了一个纯功能的、懒惰的运行时,附带了副作用跟踪和monad理解(如Pablisco所示)。

它包含一个IO类型,它等价于suspend () -> A,具有许多强大的并发原语,如SemaphoreQueueRefPromise等,它们都保证了资源安全,同时提供了强大的并发和并行组合器以及自动取消支持。(在下一个版本中,我们还将支持挂起() -> Either)

与KotlinX Coroutines不同,它提供了对Kotlin暂停系统的热切实现,并提供了协作取消支持和冷流实现。

票数 9
EN

Stack Overflow用户

发布于 2020-02-13 08:37:07

Arrow fx在处理IO时使用协同线,而不是替换它们。类似于Room具有允许使用Flow的扩展。

然而,fx可以与单线程组件一起使用,比如选项,或者两者之一。

代码语言:javascript
复制
val ab :Option<Int> = Option.fx {
  val a: Int = maybeA.bind()
  val b: Int = maybeB.bind()
  a + b
}

正如你所看到的,如果其中任何一个可能是缺席的,那么结果将是缺席的。这相当于:

代码语言:javascript
复制
maybeA.flatMap { a -> 
  maybeB.map { b -> a + b }
}

在处理这些功能数据类型时会变得很混乱。

因此,Arrow fx帮助我们如何处理绑定,从而使它更有功能。

此外,我们现在有Arrow Meta (WIP),它使用编译器插件使Arrow更加无缝。在未来,我们将能够做这样的事情:

代码语言:javascript
复制
val ab :Option<Int> = Option.fx {
 val a: Int by maybeA
 val b: Int by maybeB
 a + b
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60200971

复制
相关文章

相似问题

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