Arrow-Kt Fx 与 Kotlin 协同程序

Arrow-Kt Fx vs Kotlin Coroutines

我正在努力学习 Arrow-Kt 因为我对 Functional Programming in Kotlin 感到好奇。

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

这两者如何结合在一起?

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
}

Arrow fx uses coroutines when dealing with IO, doesn't replace them. Similar to how Room has extensions that allow to use Flow.

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

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

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

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

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