Ich bin nicht mit der Flow-API vertraut.
Der Begriff „Heben“ stammt aus der Kategorietheorie. In Programmiersprachen wie Haskell oder Scala liftübernimmt eine Funktion eine Funktion A => Bund führt auf irgendeine Weise Magie aus, so dass die aufgehobene Funktion F[A] => F[B]auf einen Funktor oder eine Monade angewendet werden kann F[A].
Ein konkretes Beispiel mit dem SeqContainer von Scala : Angenommen, wir haben eine Funktion def double(x: Int): Int = 2 * xund eine Sequenz val xs = Seq(1, 2, 3). Wir können nicht double(xs)wegen inkompatiblen Typen. Aber wenn wir einen bekommen val doubleSeq = liftToSeq(double), können wir das tun doubleSeq(xs), was sich auszahlt Seq(2, 4, 6). Hier liftToSeqkann als implementiert werden
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Der Seq(…)Konstruktor kann auch als Hebevorgang angesehen werden, der die Werte 1, 2, 3in eine SeqInstanz hebt und es uns ermöglicht, Listenabstraktionen für diese Werte zu verwenden.
Monaden ermöglichen es uns, das Innenleben eines bestimmten Typs zu kapseln, indem sie eine wasserdichte, aber zusammensetzbare Oberfläche bieten. Die Verwendung einer gehobenen Darstellung erleichtert das Nachdenken über eine Berechnung. Das Verwenden solcher Abstraktionen bedeutet auch, dass wir das Wissen über die abstrahierten Besonderheiten verlieren, aber diese werden benötigt, um eine effiziente Implementierung unter der Haube zu ermöglichen (Finden einer geeigneten Ausführungsrepräsentation).