Saya tidak terbiasa dengan Flow API.
Istilah "mengangkat" berasal dari teori kategori. Dalam bahasa pemrograman seperti Haskell atau Scala, suatu lift
fungsi mengambil fungsi A => B
, dan entah bagaimana melakukan sihir sehingga fungsi yang diangkat F[A] => F[B]
dapat diterapkan ke functor atau monad F[A]
.
Contoh konkret menggunakan Seq
wadah Scala : Asumsikan kita memiliki fungsi def double(x: Int): Int = 2 * x
, dan urutan val xs = Seq(1, 2, 3)
. Kami tidak dapat double(xs)
karena jenis yang tidak kompatibel. Tetapi jika kita memperoleh val doubleSeq = liftToSeq(double)
, kita bisa melakukan doubleSeq(xs)
, yang dievaluasi Seq(2, 4, 6)
. Di sini, liftToSeq
bisa diimplementasikan sebagai
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
The Seq(…)
konstruktor juga dapat dilihat sebagai operasi pengangkatan, yang mengangkat nilai-nilai 1, 2, 3
menjadi Seq
contoh, sehingga memungkinkan kita untuk menggunakan daftar abstraksi untuk nilai-nilai ini.
Monads memungkinkan kita untuk merangkum bagian dalam dari beberapa tipe dengan menawarkan antarmuka yang kedap air tetapi dapat digabungkan. Menggunakan representasi terangkat dapat membuatnya lebih mudah untuk alasan tentang perhitungan. Menggunakan abstraksi semacam itu juga berarti bahwa kita kehilangan pengetahuan tentang spesifik yang diabstraksi, tetapi diperlukan untuk menyediakan implementasi yang efisien di bawah tenda (menemukan representasi eksekusi yang sesuai).