Я не знаком с 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случае, что позволяет нам использовать список абстракций для этих значений.
Монады позволяют нам инкапсулировать внутреннюю работу некоторого типа, предлагая водонепроницаемый, но составной интерфейс. Использование поднятого представления может облегчить рассуждение о вычислении. Использование таких абстракций также означает, что мы теряем знание об абстрагированных особенностях, но они необходимы для обеспечения эффективной реализации под капотом (поиск подходящего представления исполнения).