Non ho familiarità con l'API Flow.
Il termine "sollevamento" deriva dalla teoria delle categorie. Nei linguaggi di programmazione come Haskell o Scala, una funzione lift
prende 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 functor o a una% di F[A]
.
Un esempio concreto che utilizza il contenitore Seq
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 double(xs)
a 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 costruttore Seq(…)
può anche essere visto come un'operazione di sollevamento, che solleva i valori 1, 2, 3
in un'istanza Seq
, consentendoci quindi di utilizzare le astrazioni elenco per questi valori.
Le Monade ci permettono di incapsulare i meccanismi interni di qualche tipo offrendo un'interfaccia stagna ma componibile. L'uso di una rappresentazione sollevata può rendere più facile ragionare su un calcolo. L'uso di tali astrazioni significa anche che perdiamo la conoscenza delle specifiche astratte, ma quelle sono necessarie per fornire un'efficiente implementazione sotto il cofano (trovare una rappresentazione di esecuzione adeguata).