Acabei de encontrar este termo aqui:
http://www.codemesh.io/codemesh2014/viktor-klang
"Demonstraremos a API do Flow - uma representação levantada - e também uma maneira conectável de transformar a representação levantada na representação de execução - Materialização do fluxo".
Googling não ajudou muito.
Respostas:
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çãoA => B
e, de alguma forma, executa mágica para que a função levantadaF[A] => F[B]
possa ser aplicada a um functor ou mônadaF[A]
.Um exemplo concreto usando o
Seq
contêiner de Scala : Suponha que temos uma funçãodef double(x: Int): Int = 2 * x
e uma sequênciaval xs = Seq(1, 2, 3)
. Não podemosdouble(xs)
devido a tipos incompatíveis. Mas se obtivermos umval doubleSeq = liftToSeq(double)
, podemos fazer odoubleSeq(xs)
que é avaliado comoSeq(2, 4, 6)
. Aqui,liftToSeq
pode ser implementado comoO
Seq(…)
construtor também pode ser visto como uma operação de elevação, que eleva os valores1, 2, 3
em umaSeq
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).
fonte
+
definido de forma queint + int --> int
. O operador levantado para anulávelint? + int? --> int?
possui a semântica de "se um operando for nulo, a resposta é nula; caso contrário, use o operador não levantado nos valores".A
eB
, e um functorF
que é um construtor de tipos.F
é um construtor de tipos, entãoF[A]
é um dos tipos construídos. Então, por que é errado falar desses quatro tipos? (dois tipos e um tipo construtor seria igualmente excelentes embora, é claro)É claro que o termo levantar pode ter significados diferentes, dependendo do contexto.
Na programação genérica , descreve o processo de abstração para o próximo nível superior. Por exemplo, você pode ter dois pedaços de código, um tipo com
int
e o outro comfloat
. A elevação desse código significaria algo como modelar o método com um tipo genéricoT
que funcione para ambos,int
efloat
.Eu achei esse uso do termo uma boa orientação intuitiva para o que significa elevação . A única diferença que parece existir entre os diferentes contextos é o que realmente é essa abstração mais alta.
Em particular, Viktor é conhecido no contexto da programação funcional e, nesse contexto, você pode encontrar interpretações visivelmente diferentes de elevação lá. Um exemplo é elevar valores em um functor ou elevar funções para trabalhar com valores monádicos (por exemplo, de Haskell
liftM2
).Um exemplo muito concreto de uma "representação levantada" poderia, por exemplo, f.ex. ser um
List(1)
, ou umSome(1)
.fonte
Geralmente, esses tipos de conceitos são mais fáceis de entender com um exemplo concreto. Considere o seguinte trecho deste exemplo da API de fluxo :
Isso leva o seguinte código:
e "eleva" isso a um
Flow
contexto. Isso permite que você use a mesma sintaxe com a qual você está familiarizado para especificar seu algoritmo, mas, nos bastidores, issomap
é feito em paralelo em vários processadores ou até em máquinas; depois, eleforeach(println)
coleta a saída de volta para um processador para impressão.Este é um termo genérico que pode se referir a agrupar qualquer contexto em torno de qualquer tipo. Outro exemplo mais familiar é
map
pegar uma função que trabalha em um único elemento e a "eleva" ao novo contexto de trabalho em uma coleção desses elementos. O levantamento é onipresente na programação funcional e um dos principais motivos pelos quais é muito mais fácil reutilizar o código funcional.fonte