Я не знайомий з API API.
Термін "підняття" походить від теорії категорій. У мовах програмування, таких як Haskell або Scala, lift
функція приймає функцію A => B
і якось виконує магію, щоб підняту функцію F[A] => F[B]
можна застосувати до функтора або монади F[A]
.
Конкретний приклад використання Seq
контейнера Scala : Припустимо, у нас є функція def double(x: Int): Int = 2 * x
та послідовність val xs = Seq(1, 2, 3)
. Ми не можемо double(xs)
через несумісні типи. Але якщо ми отримаємо a val doubleSeq = liftToSeq(double)
, ми можемо зробити це doubleSeq(xs)
, що оцінює Seq(2, 4, 6)
. Тут liftToSeq
можна реалізувати як
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Seq(…)
Конструктор також можна розглядати як операції підйому, який піднімає значення 1, 2, 3
в Seq
разі, що дозволяє нам використовувати список абстракцій для цих значень.
Монади дозволяють нам інкапсулювати внутрішні роботи якогось типу, пропонуючи водонепроникний, але сумісний інтерфейс. Використання піднятого представлення може полегшити міркування про обчислення. Використання таких абстракцій також означає, що ми втрачаємо знання про вилучені специфіки, але вони потрібні для забезпечення ефективної реалізації під кришкою (пошуку відповідного представлення виконання).