No estoy familiarizado con la API de flujo.
El término "levantamiento" proviene de la teoría de categorías. En lenguajes de programación como Haskell o Scala, una función lift
toma una función A => B
, y de alguna manera realiza magia para que la función levantada F[A] => F[B]
pueda aplicarse a un functor o mónada F[A]
.
Un ejemplo concreto utilizando el contenedor Seq
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 un val doubleSeq = liftToSeq(double)
, podemos hacer doubleSeq(xs)
, 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 constructor Seq(…)
también se puede ver como una operación de elevación, que eleva los valores 1, 2, 3
a una instancia Seq
, lo que nos permite utilizar abstracciones de lista para estos valores.
Las mónadas nos permiten encapsular el funcionamiento interno de algún tipo al ofrecer una interfaz impermeable pero compostable. El uso de una representación elevada puede facilitar el razonamiento de un cálculo. El uso de tales abstracciones también significa que perdemos el conocimiento de las características específicas abstraídas, pero que son necesarias para proporcionar una implementación eficiente bajo el capó (encontrar una representación de ejecución adecuada).