Je viens de parcourir ce terme ici:
http://www.codemesh.io/codemesh2014/viktor-klang
"Nous allons démontrer l'API Flow — une représentation levée — ainsi qu'un moyen enfichable de transformer la représentation levée en représentation d'exécution — la matérialisation du flux.”
La recherche sur Google n'a pas beaucoup aidé.
scala
actor-model
akka
dataflow
Tanière
la source
la source
Réponses:
Je ne connais pas l'API Flow.
Le terme «levage» vient de la théorie des catégories. Dans les langages de programmation tels que Haskell ou Scala, une
lift
fonction prend une fonctionA => B
, et effectue en quelque sorte la magie de sorte que la fonction levéeF[A] => F[B]
peut être appliquée à un foncteur ou une monadeF[A]
.Un exemple concret utilisant le
Seq
conteneur de Scala : Supposons que nous ayons une fonctiondef double(x: Int): Int = 2 * x
et une séquenceval xs = Seq(1, 2, 3)
. Nous ne pouvons pas endouble(xs)
raison de types incompatibles. Mais si nous obtenons unval doubleSeq = liftToSeq(double)
, nous pouvons le fairedoubleSeq(xs)
, ce qui correspond àSeq(2, 4, 6)
. Ici,liftToSeq
peut être implémenté commeLe
Seq(…)
constructeur peut également être vu comme une opération de levage, qui soulève les valeurs1, 2, 3
dans uneSeq
instance, nous permettant ainsi d'utiliser des abstractions de liste pour ces valeurs.Les monades nous permettent d'encapsuler le fonctionnement interne d'un certain type en offrant une interface étanche mais composable. L'utilisation d'une représentation levée peut faciliter la réflexion sur un calcul. L'utilisation de telles abstractions signifie également que nous perdons la connaissance des spécificités abstraites, mais celles-ci sont nécessaires pour fournir une implémentation efficace sous le capot (trouver une représentation d'exécution appropriée).
la source
+
défini un opérateur tel queint + int --> int
. L'opérateur levé à nullableint? + int? --> int?
a la sémantique "si l'un des opérandes est nul alors la réponse est nulle, sinon utilisez l'opérateur non levé sur les valeurs".A
etB
, et un foncteurF
qui est un constructeur de type.F
c'est un constructeur de type, alorsF[A]
c'est l'un de ses types construits. Alors pourquoi est-ce mal de parler de ces quatre types? (deux types et un constructeur de type seraient tout aussi bien, bien sûr)Le terme lever peut bien entendu avoir différentes significations selon le contexte.
Dans la programmation générique, il décrit le processus d'abstraction au niveau supérieur suivant. Par exemple, vous pouvez avoir deux morceaux de code, un type avec
int
et l'autre avecfloat
. Soulever ce code signifierait quelque chose comme un modèle de la méthode avec un type génériqueT
qui fonctionne pour les deux,int
etfloat
.J'ai trouvé que cette utilisation du terme était une bonne directive intuitive pour ce que signifie le levage . La seule différence qui semble exister entre les différents contextes est ce qu'est réellement cette abstraction supérieure.
En particulier, Viktor est connu dans le contexte de la programmation fonctionnelle, et dans ce contexte, vous pouvez y trouver des interprétations visuellement différentes de la levée . Un exemple, est de soulever des valeurs dans un foncteur, ou de lever des fonctions pour travailler sur des valeurs monadiques (c'est-à-dire Haskell
liftM2
).Un exemple très concret de "représentation levée" pourrait alors ex. être un
List(1)
ou unSome(1)
.la source
Ces types de concepts sont généralement plus faciles à comprendre avec un exemple concret. Considérez l'extrait suivant de cet exemple d'API Flow :
Cela prend le code suivant:
et le "met" dans un
Flow
contexte. Cela vous permet d'utiliser la même syntaxe que vous connaissez pour spécifier votre algorithme, mais en arrièremap
-plan, cela se fait en parallèle sur plusieurs processeurs ou même sur des machines, puis leforeach(println)
collecte de manière transparente cette sortie vers un processeur pour l'impression.Il s'agit d'un terme générique qui peut faire référence à l'habillage de tout contexte autour de tout type. Un autre exemple plus familier est celui qui
map
prend une fonction qui fonctionne sur un seul élément et la "lève" dans le nouveau contexte de travail sur une collection de ces éléments. Le levage est omniprésent dans la programmation fonctionnelle et l'une des principales raisons pour lesquelles il est tellement plus facile de réutiliser le code fonctionnel.la source