Nie znam interfejsu API Flow.
Termin „podnoszenie” pochodzi od teorii kategorii. W językach programowania, takich jak Haskell lub Scala, lift
funkcja przyjmuje funkcję A => B
i w jakiś sposób wykonuje magię, dzięki czemu podniesioną funkcję F[A] => F[B]
można zastosować do funktora lub monady F[A]
.
Konkretny przykład z wykorzystaniem Seq
kontenera Scali : Załóżmy, że mamy funkcję def double(x: Int): Int = 2 * x
i sekwencję val xs = Seq(1, 2, 3)
. Nie możemy z double(xs)
powodu niezgodnych typów. Ale jeśli otrzymamy val doubleSeq = liftToSeq(double)
, możemy to zrobić doubleSeq(xs)
, co ocenia Seq(2, 4, 6)
. Tutaj liftToSeq
można zaimplementować jako
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Seq(…)
Konstruktor może być również postrzegane jako operacja podnoszenia, który podnosi wartość 1, 2, 3
na Seq
przykład, co pozwala nam korzystać z list abstrakcje dla tych wartości.
Monady pozwalają nam enkapsulować wewnętrzne działania pewnego rodzaju, oferując wodoszczelny, ale łatwy do skomponowania interfejs. Zastosowanie podniesionej reprezentacji może ułatwić uzasadnienie obliczeń. Korzystanie z takich abstrakcji oznacza również, że tracimy wiedzę na temat abstrakcji, ale są one potrzebne do zapewnienia efektywnej implementacji pod maską (znalezienie odpowiedniej reprezentacji wykonania).