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 fonction A => B
, et effectue en quelque sorte la magie de sorte que la fonction levée F[A] => F[B]
peut être appliquée à un foncteur ou une monade F[A]
.
Un exemple concret utilisant le Seq
conteneur de Scala : Supposons que nous ayons une fonction def double(x: Int): Int = 2 * x
et une séquence val xs = Seq(1, 2, 3)
. Nous ne pouvons pas en double(xs)
raison de types incompatibles. Mais si nous obtenons un val doubleSeq = liftToSeq(double)
, nous pouvons le faire doubleSeq(xs)
, ce qui correspond à Seq(2, 4, 6)
. Ici, liftToSeq
peut être implémenté comme
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Le Seq(…)
constructeur peut également être vu comme une opération de levage, qui soulève les valeurs 1, 2, 3
dans une Seq
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).