Acabo de encontrar este término aquí:
http://www.codemesh.io/codemesh2014/viktor-klang
"Mostraremos la API de Flow, una representación levantada, así como una forma conectable de transformar la representación levantada en la representación de ejecución: Materialización de flujo".
Buscar en Google no ayudó mucho.
scala
actor-model
akka
dataflow
Guarida
fuente
fuente
Respuestas:
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ónA => B
y de alguna manera realiza magia para que la función elevadaF[A] => F[B]
pueda aplicarse a un functor o mónadaF[A]
.Un ejemplo concreto con el
Seq
contenedor de Scala : supongamos que tenemos una funcióndef double(x: Int): Int = 2 * x
y una secuenciaval xs = Seq(1, 2, 3)
. No podemosdouble(xs)
debido a tipos incompatibles. Pero si obtenemos aval doubleSeq = liftToSeq(double)
, podemos hacerdoubleSeq(xs)
, lo que se evalúa comoSeq(2, 4, 6)
. Aquí,liftToSeq
se puede implementar comoEl
Seq(…)
constructor también puede verse como una operación de elevación, que eleva los valores1, 2, 3
a unaSeq
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).
fuente
+
definido de tal maneraint + int --> int
. El operador elevado a anulableint? + int? --> int?
tiene la semántica de "si cualquiera de los operandos es nulo, la respuesta es nula; de lo contrario, utilice el operador no elevado en los valores".A
yB
, y un functorF
que es un constructor de tipos.F
es un constructor de tipos, entoncesF[A]
es uno de sus tipos construidos. Entonces, ¿por qué está mal hablar de estos cuatro tipos? (dos tipos y un constructor de tipos serían igualmente buenos, por supuesto)El término para levantar puede, por supuesto, tener diferentes significados según el contexto.
En la programación genérica , describe el proceso de abstracción al siguiente nivel superior. Por ejemplo, podría tener dos piezas de código, una con
int
y la otra confloat
. Levantar este código significaría algo así como crear una plantilla del método con un tipo genéricoT
que funcione para ambos,int
yfloat
.Este uso del término me pareció una buena guía intuitiva para lo que significa levantar objetos. La única diferencia que parece existir entre los diferentes contextos es lo que realmente es esta abstracción superior.
En particular, Viktor es conocido en el contexto de la programación funcional, y en este contexto, puede encontrar interpretaciones visualmente diferentes de levantar allí. Un ejemplo es elevar valores a un functor, o elevar funciones para trabajar en valores monádicos (es decir, Haskell
liftM2
).Un ejemplo muy concreto de una "representación elevada" podría entonces f.ex. ser una
List(1)
, o unSome(1)
.fuente
Este tipo de conceptos son generalmente más fáciles de entender con un ejemplo concreto. Considere el siguiente extracto de este ejemplo de Flow API :
Esto toma el siguiente código:
y lo "eleva" a un
Flow
contexto. Eso le permite usar la misma sintaxis con la que está familiarizado para especificar su algoritmo, pero detrás de escenamap
se realiza en paralelo en varios procesadores o incluso máquinas, y luegoforeach(println)
recolecta sin problemas esa salida a un procesador para imprimir.Este es un término genérico que puede referirse a envolver cualquier contexto alrededor de cualquier tipo. Otro ejemplo más familiar es
map
tomar una función que funciona en un solo elemento y la "eleva" al nuevo contexto de trabajo en una colección de esos elementos. Lifting es omnipresente en la programación funcional y una de las principales razones por las que es mucho más fácil reutilizar el código funcional.fuente