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 => B
und 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 Seq
Container von Scala : Angenommen, wir haben eine Funktion def double(x: Int): Int = 2 * x
und 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 liftToSeq
kann 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, 3
in eine Seq
Instanz 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).