Arrow-Kt Fx против Kotlin сопрограмм - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь выучить Arrow-Kt, поскольку мне стало любопытно узнать о Functional Programming in Kotlin.

Может кто-нибудь объяснить, почему существует необходимость в создании другой конструкции, которая функционирует почти так же, как Kotlin Coroutines? или я не прав в моем понимании этого?

Как эти два t ie объединяются?

Ответы [ 2 ]

5 голосов
/ 13 февраля 2020

Arrow fx использует сопрограммы при работе с IO, не заменяет их. Подобно тому, как у Room есть расширения, позволяющие использовать Flow.

Это неправильно, Arrow Fx создает чисто функциональную библиотеку времени выполнения для системы приостановки Kotlin. KotlinX Coroutines создает библиотеку времени выполнения для библиотеки Kotlin.

Таким образом, обе библиотеки предлагают реализацию для системы приостановки Kotlin и могут использоваться взаимозаменяемо или независимо, в зависимости от ваших потребностей или использования. -cases.

Arrow Fx предлагает чисто функциональную ленивую среду выполнения для системы приостановки Kotlin с отслеживанием побочных эффектов и пониманием монад (как показано Паблиско).

Содержит тип IO, который эквивалентен suspend () -> A и имеет много мощных примитивов параллелизма, таких как Semaphore, Queue, Ref, Promise и др. c. Все они гарантируют безопасность ресурсов, предлагая мощные параллельные и параллельные комбинаторы и автоматически отменяя поддержку. (В следующей версии у нас также будет поддержка suspend () -> Either)

В отличие от KotlinX Coroutines, который предлагает готовую реализацию системы приостановки Kotlin с поддержкой совместного отмены и реализацией холодного потока.

2 голосов
/ 13 февраля 2020

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
}
...