Các lập trình viên đi qua các chức năng mỗi ngày. Một hàm đại diện cho một kiểu quan hệ đặc biệt:mọi giá trị đầu vào mà hàm nhận được đều được liên kết với một số giá trị đầu ra. Vì vậy, nói một cách chung chung hơn, một hàm là một quy tắc ánh xạ một số giá trị đầu vào với một giá trị đầu ra.
Ý tưởng cơ bản đằng sau thành phần chức năng là áp dụng một chức năng này vào kết quả của một chức năng khác. Vì vậy, nó là một khái niệm toán học về việc kết hợp các hàm thành một hàm.
Bắt đầu
Hãy thảo luận về nó cùng với khái niệm toán học. Trong sơ đồ trên, “f” và “g” là hai hàm. Chúng ta có thể biểu diễn các chức năng như sau:
f: A -> Bg: B -> C
Nếu chúng ta lập thành phần của hai hàm này, thì chúng ta có thể biểu diễn nó là “g o f” (bạn có thể nói g trong f).
(g o f): A -> C such that (g o f)(a) = g(f(a)) for all a in A
Hãy thử khám phá nó nhiều hơn với một ví dụ đơn giản:
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
Khái niệm này không chỉ áp dụng trong toán học - chúng ta cũng có thể áp dụng nó trong các ngôn ngữ lập trình. Những ngôn ngữ đó được gọi là ngôn ngữ lập trình chức năng. Hiểu khái niệm này sẽ cải thiện khả năng đọc mã của bạn và giúp các lập trình viên khác dễ hiểu hơn.
Giới thiệu về Swift như một ngôn ngữ lập trình chức năng
Bây giờ, tin tốt là swift cũng là một ngôn ngữ lập trình chức năng. Trong lập trình Swift, một hàm có vai trò quan trọng nhất, vì vậy bạn sẽ tương tác với chúng hàng ngày. Một hàm Swift có thể trả về một giá trị và sau đó chúng ta có thể sử dụng giá trị trả về làm đầu vào cho một hàm khác. Đây là một phương pháp lập trình phổ biến.
Triển khai thành phần hàm trong nhanh chóng
Giả sử chúng ta có một mảng các số nguyên và chúng ta muốn đầu ra là một mảng bình phương gồm các số nguyên chẵn duy nhất. Vì vậy, thông thường, chúng tôi sẽ triển khai các chức năng như sau:
Mã này cung cấp cho chúng tôi đầu ra chính xác, nhưng như bạn có thể thấy, khả năng đọc của mã không tốt. Ngoài ra, thứ tự gọi hàm trông giống như ngược lại với những gì chúng tôi muốn và nó có thể tạo ra sự nhầm lẫn cho một số lập trình viên mới. Khối mã này khó phân tích.
Vì vậy, ở đây có thành phần chức năng để giải cứu chúng ta khỏi tất cả các vấn đề trên. Chúng ta có thể đạt được thành phần chức năng bằng cách tận dụng các yếu tố chung, hàm đóng và toán tử infix.
Vì vậy, hãy xem điều gì đang xảy ra trong khối mã trên:
- Chúng tôi đã khai báo toán tử infix tùy chỉnh “>>>”. Nó đã để lại tính kết hợp và thứ tự ưu tiên giống như toán tử +.
- Chúng tôi đã khai báo một hàm có tên giống với tên của toán tử infix. Hàm sử dụng ba số chung T, U, V và cần hai lần đóng làm tham số đầu vào.
- Tham số bên trái là một bao đóng và nó nhận đầu vào kiểu T và trả về đầu ra kiểu U.
- Tham số bên phải cũng là một bao đóng và nó nhận đầu vào kiểu U và trả về đầu ra kiểu V.
- Bây giờ, hàm>>> trả về một hàm hoặc bao đóng, có kiểu (T) → V. Đóng đầu ra nhận đầu vào kiểu T và trả về đầu ra kiểu V. Đây là đầu ra bên trái tham số là đầu vào của tham số phù hợp.
left : (T) -> U right: (U) -> V
Output Type: (T) -> V
Nếu bạn hiểu cách biểu diễn toán học của thành phần hàm, thì bạn có thể thấy rằng nó hoàn toàn giống với cách triển khai của Swift.
6. Trong phần thân hàm, nó trả về kết quả của tham số bên phải trên tham số bên trái.
Bây giờ nếu chúng ta muốn có cùng một kết quả (một mảng bình phương gồm các số nguyên chẵn duy nhất), chúng ta có thể thực hiện điều này với thành phần hàm.
Nó là một chuỗi các hàm trả về cùng một kết quả. Thứ tự chức năng bây giờ trông tương tự như những gì một con người có thể nghĩ. Nó có khả năng dễ đọc tốt hơn và dễ hiểu hơn đối với mọi người.
Cảm ơn bạn đã đọc!