Tôi không quen thuộc với API Flow.
Thuật ngữ nâng nâng hạ xuất phát từ lý thuyết thể loại. Trong các ngôn ngữ lập trình như Haskell hoặc Scala, một lift
hàm có chức năng A => B
và bằng cách nào đó thực hiện phép thuật để chức năng nâng F[A] => F[B]
có thể được áp dụng cho functor hoặc monadF[A]
.
Một ví dụ cụ thể sử dụng bộ Seq
chứa của Scala : Giả sử chúng ta có một hàm def double(x: Int): Int = 2 * x
và một chuỗi val xs = Seq(1, 2, 3)
. Chúng tôi không thể double(xs)
do các loại không tương thích. Nhưng nếu chúng ta có được một val doubleSeq = liftToSeq(double)
, chúng ta có thể làm doubleSeq(xs)
, mà ước tính Seq(2, 4, 6)
. Ở đây, liftToSeq
có thể được thực hiện như
def liftToSeq[A, B](f: A => B): (Seq[A] => Seq[B]) =
(seq: Seq[A]) => seq.map(f)
Hàm Seq(…)
tạo cũng có thể được xem như là một hoạt động nâng, nâng các giá trị 1, 2, 3
thành một Seq
thể hiện, do đó cho phép chúng ta sử dụng các tóm tắt danh sách cho các giá trị này.
Monads cho phép chúng tôi gói gọn các hoạt động bên trong của một số loại bằng cách cung cấp một giao diện kín nước nhưng có thể ghép lại được. Sử dụng một đại diện nâng có thể làm cho nó dễ dàng hơn để suy luận về một tính toán. Sử dụng các khái niệm trừu tượng như vậy cũng có nghĩa là chúng ta mất kiến thức về các chi tiết cụ thể trừu tượng hóa, nhưng chúng cần thiết để cung cấp một triển khai hiệu quả dưới mui xe (tìm một đại diện thực thi phù hợp).