Não estou familiarizado com a API de fluxo.
O termo "levantamento" vem da teoria das categorias. Em linguagens de programação como Haskell ou Scala, uma lift
função assume uma função A => B
e, de alguma forma, executa mágica para que a função levantada F[A] => F[B]
possa ser aplicada a um functor ou mônada F[A]
.
Um exemplo concreto usando o Seq
contêiner de Scala : Suponha que temos uma função def double(x: Int): Int = 2 * x
e uma sequência val xs = Seq(1, 2, 3)
. Não podemos double(xs)
devido a tipos incompatíveis. Mas se obtivermos um val doubleSeq = liftToSeq(double)
, podemos fazer o doubleSeq(xs)
que é avaliado como Seq(2, 4, 6)
. Aqui, liftToSeq
pode ser implementado como
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
O Seq(…)
construtor também pode ser visto como uma operação de elevação, que eleva os valores 1, 2, 3
em uma Seq
instância, permitindo usar abstrações de lista para esses valores.
As mônadas nos permitem encapsular o funcionamento interno de algum tipo, oferecendo uma interface estanque, mas compostável. O uso de uma representação levantada pode facilitar o raciocínio sobre um cálculo. Usar essas abstrações também significa que perdemos o conhecimento das especificidades abstraídas, mas são necessárias para fornecer uma implementação eficiente sob o capô (encontrar uma representação de execução adequada).