Non ho familiarità con l'API Flow.
Il termine "sollevamento" deriva dalla teoria delle categorie. In linguaggi di programmazione come Haskell o Scala, una lift
funzione assume una funzione A => B
e 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 Seq
contenitore di Scala : Supponiamo di avere una funzione def double(x: Int): Int = 2 * x
e 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, liftToSeq
può 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, 3
in Seq
un'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).