3

我正在努力学习Arrow-Kt,因为我对Functional Programming in Kotlin.

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

这两者如何结合在一起?

4

2 回答 2

9

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

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

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

Arrow Fx 为 Kotlin 的挂起系统提供了一个纯函数式的惰性运行时,具有副作用跟踪和 monad 理解(如 Pablisco 所示)。

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

与 KotlinX Coroutines 相比,它提供了 Kotlin 挂起系统的急切实现,具有协作取消支持和冷流实现。

于 2020-02-13T09:16:22.497 回答
2

Arrow fx 在处理 时使用协程IO,不会替换它们。类似于 Room 的扩展允许使用Flow.

但是,fx 可以与 Option 或 Either 等单线程组件一起使用。

val ab :Option<Int> = Option.fx {
  val a: Int = maybeA.bind()
  val b: Int = maybeB.bind()
  a + b
}

如您所见,如果没有任何可能,那么结果将不存在。这相当于做:

maybeA.flatMap { a -> 
  maybeB.map { b -> a + b }
}

在处理这些函数数据类型的负载时会变得混乱。

因此,Arrow fx 帮助我们以一种更实用的方式使用绑定。

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

val ab :Option<Int> = Option.fx {
 val a: Int by maybeA
 val b: Int by maybeB
 a + b
}
于 2020-02-13T08:37:07.533 回答