5 ngôn ngữ lập trình hàm bạn nên biết

Nếu dành thời gian để tìm hiểu xu hướng lập trình trên Internet, hẳn bạn đã nghe đến lập trình hàm (functional programming). Vậy lập trình hàm là gì? Thậm chí khi hiểu về lập trình hàm nhưng bạn có biết ngôn ngữ lập trình nào phù hợp với nó nhất không? Không phải ngôn ngữ lập trình nào cũng giống nhau, được tạo ra cùng một mục đích. Mặc dù bạn có thể áp dụng mô hình lập trình hàm trong nhiều ngôn ngữ, nhưng sẽ có những ngôn ngữ thích hợp hơn. Dưới đây là 5 ngôn ngữ lập trình hàm bạn nên biết.

Lập trình hàm là gì?

Nếu có nền tảng về toán học, bạn sẽ dễ dàng sử dụng lập trình hàm vì mô hình lập trình hàm xử lý tính toán như các hàm toán học. Nếu không biết gì về toán học, bạn sẽ cảm thấy bối rối khi lập trình hàm.

Về cơ bản, lập trình hàm coi các hàm và dữ liệu như đối tượng bất biến. Khi sử dụng dữ liệu trong một hàm, nó thường trả về dữ liệu đó đã được chuyển đổi hoặc kiểu dữ liệu khác. Trong lập trình hàm, hàm sẽ không bao giờ thay đổi dữ liệu gốc hoặc trạng thái chương trình (program state).

Có một điểm tương đồng với triết lý Unix (Unix philosophy) là mỗi một chương trình sẽ làm tốt một việc của nó. Hàm cũng vậy, nó sẽ không chạm vào các phần khác trong chương trình của bạn. Thay vào đó, nó sẽ lấy đầu vào của nó và cung cấp cho bạn một đầu ra. Lý tưởng nhất là trong lập trình hàm, khi được đưa một đầu vào giống nhau, nó sẽ cho ra cùng một đầu ra.

So sánh lập trình hàm và lập trình hướng đối tượng

Trong lập trình hướng đối tượng (Object-Oriented Programming), bạn thường có một đối tượng cơ sở với nhiều phương thức khác nhau để thay đổi dữ liệu hoặc trạng thái (là một phần của đối tượng). Phương thức này có thể thay đổi dữ liệu hoặc trạng thái nếu không được nêu rõ ràng.

Điều này khiến việc bảo trì chương trình trở nên khó khăn hơn vì không rõ trạng thái và dữ liệu đã được thay đổi. Nhưng với lập trình hàm bạn sẽ không còn lo lắng vấn đề này xảy ra.

1. JavaScript

JavaScript

JavaScript cho phép lập trình hàm, bạn có thể sử dụng mô hình lập trình hàm vừa có thể sử dụng phương pháp định hướng đối tượng. Có rất nhiều mô hình lập trình hàm được tích hợp trong JavaScript như hàm higher-order. Đây là hàm có thể lấy hàm khác làm đối số.

Ngoài ra, JavaScript còn có một số hàm làm việc với mảng (array) như map(), reduce(), filter(), v.v… tất cả đều là hàm higher-order. Điều này có nghĩa là bạn có thể xâu chuỗi chúng lại với nhau để nhanh chóng thực hiện các cách thức trong một mảng.

Mặc dù JavaScript ban đầu có một số vấn đề với khả năng biến đổi, nhưng các phiên bản mới hơn của tiêu chuẩn ECMAScript cung cấp các bản sửa lỗi. Thay vì sử dụng từ khóa var để xác định biến, bạn có thể dùng constlet. Từ khóa đầu tiên cho phép bạn xác định các hằng số làm tên ngụ ý. Từ khóa thứ hai let, giới hạn phạm vi của một biến số trong hàm mà nó khai báo.

2. Python

Python

Giống như JavaScript, Python là ngôn ngữ tổng quát mà bạn có thể sử dụng bất kỳ mô hình lập trình nào. Bất cứ ngôn ngữ nào cũng có ưu và nhược điểm, nhưng lập trình hàm không nằm trong số những nhược điểm của Python.

Bạn có thể tìm thấy nhiều hàm được tích hợp trong ngôn ngữ Python như map(), filter(), reduce(), v.v... Cũng như JavaScript, đây là đều là các hàm higher-order, có thể lấy các hàm khác làm đối số. Trong Python, lập trình hàm ở dạng từ khóa lambda, đây là một lợi thế so với các ngôn ngữ khác.

Bạn có thể sử dụng biểu thức lambda theo một số cách như sử dụng nó làm shorthand (phương thức tốc ký) cho các hàm đơn giản. Khi được gán vào một biến, bạn có thể gọi chính xác biểu thức lambda giống như một hàm Python tiêu chuẩn. Ưu điểm thực sự của biểu thức lambda là khi sử dụng chúng làm hàm vô danh (anonymous function).

Các hàm vô danh cũng hoạt động với JavaScript và các ngôn ngữ khác trong danh sách này. Chúng đặc biệt hữu ích khi được sử dụng với hàm higher-order vì bạn có thể xác định chúng tại chỗ. Nếu không có hàm vô danh, bạn phải xác định trước các addition làm hàm bespoke.

3. Clojure

Clojure

Clojure là một “phương ngữ” của ngôn ngữ lập trình Lisp xuất hiện từ cuối những năm 1950. Đây là ngôn ngữ hoàn hảo cho lập trình hàm.

Giống như các biến thể của ngôn ngữ Lisp, Clojure xử lý code như dữ liệu. Điều này có nghĩa là code có thể tự thay đổi một cách hiệu quả. Tuy nhiên, Clojure có thể chạy trên nền tảng Java và được biên dịch thành JVM bytecode. Do đó nó có thể làm việc với các thư viện Java dù có được viết bằng Clojure hay không.

Không giống như các ngôn ngữ khác trong danh sách, Clojure là ngôn ngữ lập trình hàm, đảm bảo tính bất biến trong cấu trúc dữ liệu.

4. Elm

Elm

Một trong những ngôn ngữ mới trong danh sách này, Elm là ngôn ngữ lập trình hàm thuần túy được Evan Czaplicki thiết kế vào năm 2012. Ngôn ngữ này đã trở nên phổ biến trong các nhà phát triển web, đặc biệt là cho mục đích tạo giao diện người dùng.

Không giống như các ngôn ngữ trong danh sách này, Elm sử dụng kiểm tra kiểu tĩnh (static type checking), đảm bảo không xảy ra lỗi runtime exception, bắt lỗi ngay trong khi biên dịch. Người dùng sẽ ít thấy lỗi hơn, đây là một điểm cộng lớn cho ngôn ngữ này.

Trình biên dịch Elm sử dụng HTML, CSS và JavaScript. Cũng giống như cách Clojure viết các chương trình chạy trên Java, bạn có thể viết ứng dụng sử dụng thư viện JavaScript với Elm.

Một điểm khác biệt chính giữa Elm và các ngôn ngữ khác ở đây là bạn sẽ không tìm thấy filter(), map() và các hàm tương tự. Thay vào đó, chúng được xác định bởi loại dữ liệu như List.map hoặc Dict.map.

5. Haskell

Haskell

Haskell là một ngôn ngữ lập trình hàm, sử dụng kiểm tra tĩnh. Không giống Elm, Haskell đã xuất hiện được một thời gian. Phiên bản đầu tiên của ngôn ngữ được thiết kế vào năm 1990. Tiêu chuẩn mới nhất là Haskell 2010 và phiên bản tiếp theo dự định ra mắt vào năm 2020.

Haskell là ngôn ngữ được thiết kế cho mục đích lập trình hàm cho nên nó phù hợp để giải quyết các vấn đề thế giới thực mặc dù nguồn gốc của lập trình hàm là trong giới học thuật.

Haskell được sử dụng trong các dự án được dùng rộng rãi như trình quản lý cửa sổ Xmonad được viết hoàn toàn bằng Haskell và Pandoc chuyển đổi các kiểu markup khác nhau thành các định dạng khác cũng sử dụng ngôn ngữ này. Bạn sẽ tìm thấy một số hàm tiêu chuẩn như map(), filter(), reduce() và các hàm bậc cao khác.

Một số thuật ngữ và ngôn ngữ ở trên có vẻ hơi khó hiểu nếu bạn không phải là một lập trình viên dạn dày kinh nghiệm. Điều đó thật tốt, vì khám phá những cái mới là một trong những bước đầu tiên để trở thành một người học giỏi. Bạn có thể tham khảo bài viết Người mới bắt đầu học lập trình máy tính cần tập trung vào những gì?

Thứ Hai, 13/05/2019 16:00
56 👨 1.098