Functional Programming là gì?

Posted: 08/05/2011 in F#

Functional Programming[1] là thể loại lâu đời nhất trong ba paradigm[2] lập trình chính. Ngôn ngữ FP đầu tiên là IFP, được phát minh vào năm 1955, một năm trước khi có Fortran. Sau đó, LISP ra đời năm 1958, một năm trước khi có COBOL. Cả Fortran và COBOL đều là những ngôn ngữ imperative[3] (hay còn gọi là procedural). Chúng đặc biệt thành công khi được ứng dụng vào tính toán khoa học và nghiệp vụ, và trở thành paradigm thống trị trong suốt 30 đầu của kỉ nguyên thông tin. Vào những năm 1970, Object-Oriented[4] paradigm bắt đầu phát triển. Cùng với sự trưởng thành của các ngôn ngữ lập trình hướng đối tượng, OO trở thành paradigm được sử dụng phổ biến nhất cho đến ngày hôm nay.

Từ những năm 1950, mặc dù vẫn phát triển mạnh mẽ và liên tục với các đại diện như SML, OCaml, APL và Clean, thì FP vẫn chỉ được sử dụng cho mục đích học thuật và nghiên cứu là chủ yếu. Imperative đạt được thành công bước đầu nhờ vào những chỉ thị đơn giản. OO thành công nhờ vào khả năng mô hình hóa các bài toán phức tạp. Còn FP có khả năng gì, tại sao dù ra đời sớm nhưng lại không mang lại thành công như mong đợi?

FP xem chương trình là một tập hợp các hàm nhận vào đối số và trả về giá trị. Không giống như imperative và OO, FP không tạo ra hiệu ứng phụ[5] và sử dụng đệ qui thay cho vòng lặp. Hàm trong FP rất giống với hàm trong toán học vì nó không làm thay đổi trạng thái của chương trình. Ví dụ như:

– Một đại lượng khi được gán giá trị thì không bao giờ thay đổi giá trị đó.

– Hàm không sửa đổi giá trị của đối số được truyền vào, và giá trị do hàm trả về hoàn toàn là một giá trị mới.

Về mặt kĩ thuật cài đặt bên dưới, khi giá trị được gán vào một vùng nhớ thì được đánh dấu là đã sử dụng và không ghi đè lên nữa. Để tạo ra kết quả trả về, các hàm sao chép giá trị rồi chỉnh sửa trên các bản sao đó, không làm ảnh hưởng đến giá trị ban đầu, rồi trả về bản sao đã được chỉnh sửa. Các đại lượng không còn được hàm nào tham chiếu đến sẽ tự động bị hủy để giải phóng bộ nhớ (đây là ý tưởng của bộ thu gom rác trong Java và .NET).

Cơ sở toán học cho FP rất tường minh, cung cấp giải pháp logic và ngắn gọn cho các vấn đề tính toán. Tuy nhiên, do nó không linh hoạt thay đổi trạng thái và chuyên sử dụng đệ qui khiến người ta ưa chuộng các paradigm khác hơn để xử lý các thao tác tính toán thông dụng. Với F#, rào cản trên được giải quyết vì cho phép sử dụng nhiều paradigm và trộn lẫn chúng với nhau để giải quyết vấn đề theo cách mà bạn cho là tiện lợi nhất.


[1] Functional Programming, viết tắt là FP, dịch sang tiếng Việt nghĩa là lập trình theo chức năng.

[2] Từ ngữ paradigm bắt nguồn từ tiếng Hy Lạp, được sử dụng như thuật ngữ khoa học với nghĩa là hình mẫu, lý thuyết, khái niệm, giả thuyết hoặc khung tham chiếu. Paradigm lập trình là phong cách bạn nhìn vấn đề và ánh xạ cách nhìn của bạn vào việc xây dựng mô hình lập trình.

[3] Lập trình theo chỉ thị là một paradigm xem chương trình là danh sách các lệnh được thực hiện theo ba cấu trúc: tuần tự, rẽ nhánh và lặp. Imperative tập trung giải quyết câu hỏi “Làm thế nào xây dựng một chuỗi chỉ thị để giải quyết công việc”. Ngược lại, declarative (bao gồm FP, logic paradigm) trả lời câu hỏi “Những công việc nào cần được thực hiện để giải quyết vấn đề”.

[4] OO paradigm xem các thực thể như là các đối tượng, trong đó các thành phần dữ liệu và phương thức liên quan đến thực thể được đóng gói chung với nhau vào đối tượng.

[5] Một hàm được xem là gây ra hiệu ứng phụ khi nó làm thay đổi trạng thái của các biến hoặc các thành phần không thuộc hàm. Ví dụ như sửa giá trị của đối số, gây ra lỗi ngoại lệ, ghi dữ liệu ra file hoặc xuất chữ ra màn hình.

nguồn : http://www.vcprojects.com

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s