Я не знаком с API Flow.
Термин «подъем» происходит от теории категорий. В таких языках программирования, как Haskell или Scala, lift
функция берет функцию A => B
и каким-то образом выполняет магию, чтобы поднятую функцию F[A] => F[B]
можно было применить к функтору или монаде F[A]
.
Конкретный пример с использованием Seq
контейнера Scala . Предположим, у нас есть функция def double(x: Int): Int = 2 * x
и последовательность val xs = Seq(1, 2, 3)
. Мы не можем double(xs)
из-за несовместимых типов. Но если мы получим val doubleSeq = liftToSeq(double)
, мы можем сделать doubleSeq(xs)
, что оценивается в Seq(2, 4, 6)
. Здесь liftToSeq
можно реализовать как
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Seq(…)
Конструктор также можно рассматривать как операции подъема, который поднимает значения 1, 2, 3
в Seq
случае, что позволяет нам использовать список абстракций для этих значений.
Монады позволяют нам инкапсулировать внутреннюю работу некоторого типа, предлагая водонепроницаемый, но составной интерфейс. Использование поднятого представления может облегчить рассуждение о вычислении. Использование таких абстракций также означает, что мы теряем знание об абстрагированных особенностях, но они необходимы для обеспечения эффективной реализации под капотом (поиск подходящего представления исполнения).