Non ho familiarità con l'API Flow.
Il termine "sollevamento" deriva dalla teoria delle categorie. In linguaggi di programmazione come Haskell o Scala, una liftfunzione assume una funzione A => Be in qualche modo esegue la magia in modo che la funzione sollevata F[A] => F[B]possa essere applicata a un funzione o monade F[A].
Un esempio concreto usando il Seqcontenitore di Scala : Supponiamo di avere una funzione def double(x: Int): Int = 2 * xe una sequenza val xs = Seq(1, 2, 3). Non possiamo a double(xs)causa di tipi incompatibili. Ma se otteniamo un val doubleSeq = liftToSeq(double), possiamo fare doubleSeq(xs), che valuta Seq(2, 4, 6). Qui, liftToSeqpuò essere implementato come
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Il Seq(…)costruttore può anche essere visto come un'operazione di sollevamento, che solleva i valori 1, 2, 3in Sequn'istanza, permettendoci così di utilizzare le astrazioni dell'elenco per questi valori.
Le monadi ci consentono di incapsulare i meccanismi interni di qualche tipo offrendo un'interfaccia a tenuta stagna ma compostabile. L'uso di una rappresentazione elevata può rendere più semplice ragionare su un calcolo. L'uso di tali astrazioni significa anche che perdiamo la conoscenza dei dettagli sottratti, ma quelli sono necessari per fornire un'implementazione efficiente sotto il cofano (trovare una rappresentazione di esecuzione adatta).