我正努力学习Arrow-Kt,因为我对Functional Programming in Kotlin很好奇。
有人能解释为什么需要创建一个功能几乎类似于Kotlin Coroutines的构造吗?还是我对这件事的理解错了?
这两个是怎么绑在一起的?
发布于 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上,这样您就可以更容易地创建复杂的工作流并混合Either、suspend等的关注点,而不需要复杂的抽象或困难的理论。例如:
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,具有许多强大的并发原语,如Semaphore、Queue、Ref、Promise等,它们都保证了资源安全,同时提供了强大的并发和并行组合器以及自动取消支持。(在下一个版本中,我们还将支持挂起() -> Either)
与KotlinX Coroutines不同,它提供了对Kotlin暂停系统的热切实现,并提供了协作取消支持和冷流实现。
发布于 2020-02-13 08:37:07
Arrow fx在处理IO时使用协同线,而不是替换它们。类似于Room具有允许使用Flow的扩展。
然而,fx可以与单线程组件一起使用,比如选项,或者两者之一。
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
}https://stackoverflow.com/questions/60200971
复制相似问题