โปรแกรมเมอร์เจอ Function ทุกวัน Function แสดงความสัมพันธ์พิเศษ: Input ทุกค่าที่ Function รับ มี Output บางค่าที่เกี่ยวข้อง อย่างกว้างๆ Function คือ Rule ที่ Map Input บางค่าไปสู่ Output เดียว
แนวคิดพื้นฐานของ Function Composition คือการนำ Function หนึ่งไปใช้กับ Result ของ Function อีกตัว จึงเป็นแนวคิดทางคณิตศาสตร์การรวม Function หลายตัวเป็น Function เดียว

เริ่มต้น
มาพูดคุยพร้อมแนวคิดคณิตศาสตร์ ใน Diagram ด้านบน "f" และ "g" เป็น Function 2 ตัว แสดงได้ดังนี้:
f: A -> B g: B -> Cถ้าทำ Composition ของ Function 2 ตัวนี้ แสดงเป็น "g o f" (อ่านว่า g of f)
(g o f): A -> C such that (g o f)(a) = g(f(a)) for all a in Aลองดูตัวอย่างง่ายๆ:
Let f(a) = 2a + 3 & g(a) = 3a + 5, then function composition(g o f)(a) = g(f(a)) = 3(f(a)) + 5 = 3(2a + 3) + 5 = 6a + 14แนวคิดนี้ไม่ได้ใช้ได้แค่คณิตศาสตร์ — ใช้ในภาษาโปรแกรมมิ่งได้ด้วย ภาษาเหล่านี้เรียกว่า Functional Programming Languages การเข้าใจแนวคิดนี้ทำให้โค้ดอ่านง่ายและเข้าใจง่ายสำหรับโปรแกรมเมอร์คนอื่น
แนะนำ Swift เป็น Functional Programming Language
ข่าวดีคือ Swift ก็เป็น Functional Programming Language ใน Swift Function มีบทบาทสำคัญที่สุด จึงโต้ตอบกับมันทุกวัน Swift Function สามารถ Return ค่าได้ และนำค่าที่ Return ไปเป็น Input ของ Function อีกตัว นี่เป็นแนวปฏิบัติทั่วไป
นำ Function Composition มาใช้ใน Swift
สมมติมี Array ของ Integer ต้องการ Output เป็น Array ของจำนวนคู่ที่ไม่ซ้ำกันยกกำลังสอง ปกติเขียน Function แบบนี้:
โค้ดนี้ให้ผลถูกต้อง แต่ Readability ไม่ดี Function Calling Order ดูตรงข้ามกับที่คิด อาจสับสนโปรแกรมเมอร์ใหม่ บล็อกโค้ดนี้ยากต่อการวิเคราะห์
Function Composition ช่วยแก้ปัญหาข้างต้น ทำได้โดยใช้ Generics, Closure, และ Infix Operator
มาดูว่าบล็อกโค้ดข้างต้นทำอะไร:
- ประกาศ Custom Infix Operator ">>>" มี Left Associativity และ Precedence Order เหมือน + Operator
- ประกาศ Function ชื่อเดียวกับ Infix Operator ใช้ Generics 3 ตัว T, U, V รับ Parameter 2 Closures
- Left Parameter เป็น Closure รับ Input Type T คืน Output Type U
- Right Parameter เป็น Closure รับ Input Type U คืน Output Type V
- Function >>> คืนค่า Function หรือ Closure ที่มี Type (T) → V รับ Input Type T คืน Output Type V Output ของ Left Parameter เป็น Input ของ Right Parameter
left : (T) -> U right: (U) -> VOutput Type: (T) -> Vเข้าใจ Mathematical Representation ของ Function Composition แล้ว จะเห็นว่าเหมือนกับ Swift Implementation ทุกประการ
6. ใน Function Body คืนค่า Result ของ Right Parameter กับ Left Parameter
ตอนนี้ถ้าอยากได้ผลเดียวกัน (Array จำนวนคู่ไม่ซ้ำยกกำลังสอง) ทำได้ด้วย Function Composition
เป็น Chain ของ Functions ที่คืนผลเดียวกัน Function Order ดูคล้ายกับที่มนุษย์คิด Readability ดีขึ้น เข้าใจง่ายสำหรับทุกคน
ขอบคุณที่อ่าน!