ฉันไม่คุ้นเคยกับ Flow API
คำว่า "การยก" มาจากทฤษฎีหมวดหมู่ ในการเขียนโปรแกรมภาษาเช่น Haskell หรือสกาล่าซึ่งเป็นlift
ฟังก์ชั่นใช้เวลาฟังก์ชั่นA => B
และอย่างใดดำเนินมายากลเพื่อให้ฟังก์ชั่นยกF[A] => F[B]
สามารถนำไปใช้กับ functor หรือ F[A]
monad
ตัวอย่างที่เป็นรูปธรรมโดยใช้ Scala ของSeq
ภาชนะ: สมมติเรามีฟังก์ชั่นและลำดับที่def double(x: Int): Int = 2 * x
val xs = Seq(1, 2, 3)
เราไม่สามารถdouble(xs)
เนื่องจากประเภทที่เข้ากันไม่ได้ แต่ถ้าเราได้รับ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
ตัวอย่างจึงช่วยให้เราสามารถใช้รายการนามธรรมสำหรับค่าเหล่านี้
Monads ช่วยให้เราสามารถแค็ปซูลผลงานภายในของบางประเภทโดยนำเสนออินเทอร์เฟซแบบกันน้ำ แต่สามารถปรับแต่งได้ การใช้การนำเสนอแบบยกสามารถทำให้เหตุผลเกี่ยวกับการคำนวณง่ายขึ้น การใช้ abstractions ดังกล่าวยังหมายความว่าเราสูญเสียความรู้เกี่ยวกับข้อมูลเฉพาะที่แยกออกไป แต่สิ่งเหล่านี้จำเป็นสำหรับการนำเสนอการดำเนินการที่มีประสิทธิภาพภายใต้ประทุน (การค้นหาตัวแทนการดำเนินการที่เหมาะสม)