No estoy familiarizado con la API de Flow.
El término "levantamiento" proviene de la teoría de categorías. En lenguajes de programación como Haskell o Scala, una lift
función toma una función A => B
y de alguna manera realiza magia para que la función elevada F[A] => F[B]
pueda aplicarse a un functor o mónada F[A]
.
Un ejemplo concreto con el Seq
contenedor de Scala : supongamos que tenemos una función def double(x: Int): Int = 2 * x
y una secuencia val xs = Seq(1, 2, 3)
. No podemos double(xs)
debido a tipos incompatibles. Pero si obtenemos a val doubleSeq = liftToSeq(double)
, podemos hacer doubleSeq(xs)
, lo que se evalúa como Seq(2, 4, 6)
. Aquí, liftToSeq
se puede implementar como
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
El Seq(…)
constructor también puede verse como una operación de elevación, que eleva los valores 1, 2, 3
a una Seq
instancia, lo que nos permite usar abstracciones de lista para estos valores.
Las mónadas nos permiten encapsular el funcionamiento interno de algún tipo al ofrecer una interfaz hermética pero componible. El uso de una representación elevada puede facilitar el razonamiento sobre un cálculo. El uso de tales abstracciones también significa que perdemos el conocimiento de los detalles abstractos, pero son necesarios para proporcionar una implementación eficiente bajo el capó (encontrar una representación de ejecución adecuada).