Ngôn ngữ lambda là gì?


89

Tôi đang đọc "JavaScript: The Good Parts" và tác giả đề cập rằng JavaScript là ngôn ngữ lambda đầu tiên được khởi chạy.

Các hàm của JavaScript là các đối tượng hạng nhất với (hầu hết) phạm vi từ vựng. JavaScript là ngôn ngữ lambda đầu tiên trở thành ngôn ngữ chính thống. Sâu xa hơn, JavaScript có nhiều điểm chung với Lisp và Scheme hơn là với Java. Đó là Lisp trong trang phục của C. Điều này làm cho JavaScript là ngôn ngữ mạnh mẽ đáng kể.

Tôi không hiểu ngôn ngữ lambda là gì. Các thuộc tính của một ngôn ngữ như vậy là gì và nó khác với các ngôn ngữ như Java, C, C ++ và Php như thế nào?


6
Lambda có nghĩa là biểu thức ẩn danh. Vì vậy, ngôn ngữ lambda -> ngôn ngữ với các biểu thức nặc danh
bevacqua

Liên kết Google Sách, FYI: books.google.co.uk/…
Lucas Jones

3
Xem giải tích lambda trên wikipedia.
Oded

nhiều câu trả lời tốt. Những gì tôi hiểu cho đến nay là nếu bạn đang sử dụng hàm ẩn danh thì bạn đang làm việc trên ngôn ngữ lambda. đó có phải là sự hiểu biết chính xác về ngôn ngữ lamda khác với ngôn ngữ như java.
sushil bharwani

4
"Tôi đang đọc 'JavaScript: The Good Parts' và tác giả đề cập rằng JavaScript là ngôn ngữ lambda đầu tiên được ra mắt." Vì vậy, tôi googled lambda ngôn ngữ và tìm thấy câu hỏi này trên SO :)
Bugs Bunny

Câu trả lời:


38

Tôi chưa bao giờ nghe ai đó sử dụng thuật ngữ "ngôn ngữ lambda" và định nghĩa hợp lý duy nhất mà tôi có thể nghĩ ra sẽ loại trừ JavaScript là "ngôn ngữ đầu tiên".

Điều đó nói rằng, tôi nghi ngờ anh ta có thể có ý nghĩa:

  • Ngôn ngữ chức năng: một lớp ngôn ngữ trong đó tính toán được (hoặc có thể được) mô hình hóa như một thành phần không trạng thái của các chức năng (có thể là bậc cao hơn). LISP, Scheme, ML, Haskell, v.v. thường được gán cho lớp này, mặc dù một số trong số này là ngôn ngữ mô hình hỗn hợp hoặc "tùy chọn chức năng" đúng hơn. Javascript được cho là có chứa các tính năng cần thiết để tạo ra một "phong cách chức năng" của lập trình.
  • Các ngôn ngữ cho phép tạo các hàm ẩn danh (sử dụng functioncú pháp trong JavaScript; điều này được viết bằng lambdanhiều ngôn ngữ, do đó có thể là "ngôn ngữ lambda". "

Cả hai cách sử dụng đều bắt nguồn từ việc sử dụng chữ cái Hy Lạp lambda để biểu thị sự trừu tượng hóa hàm trong phép tính lambda, mô hình tính toán do Alonzo Church nghĩ ra và dựa trên đó lập trình hàm.

Chỉnh sửa: đã xem kết quả của Google Sách --- "lần đầu tiên trở thành chính thống"; tốt, điều đó có thể tranh luận. Tôi muốn nói rằng LISP ở một thời điểm ít nhất là chủ đạo hợp lý. Tuy nhiên, đó là một điểm công bằng, ngữ nghĩa của JavaScript được lấy cảm hứng trực tiếp từ Scheme và chắc chắn nó đã tiếp cận được lượng người xem lớn hơn bất kỳ ngôn ngữ nào khác có thể đưa ra tuyên bố tương tự.


vui lòng xem liên kết được đăng bởi Lucas Jones Liên kết sách của Google, nơi anh ấy đưa đến trang chính xác mà tôi đang nói đến. cảm ơn cho câu trả lời của bạn.
sushil bharwani

5
Lý do JavaScript được mô tả là 'đầu tiên' là vì câu lệnh đủ điều kiện để 'trở thành xu hướng chủ đạo'. Tôi nghĩ rằng khá rõ ràng rằng JavaScript thực sự là ngôn ngữ kiểu chức năng đầu tiên được các lập trình viên sử dụng hàng ngày trong các công việc hàng ngày.
rfunduk

1
ý bạn là gì khi bạn nói "kiểu chức năng" của ngôn ngữ lập trình. Tôi đến từ nền tảng java và đang cố gắng học javascript xem nó khác như thế nào.
sushil bharwani

9
Đó là một chủ đề lớn để khám phá. Năm ngoái, tôi đang ở đâu bây giờ bạn đang ở: Tôi đã tìm thấy các bài luận và bài giảng của Crockford và muốn hiểu các kết luận. Tôi khuyên bạn nên bắt đầu với Wikipedia, sau đó chuyển sang một số bài tiểu luận: John Hughes "Tại sao các vấn đề lập trình chức năng" scribd.com/doc/26902/whyfp , Slava Akhmechet "Lập trình chức năng cho phần còn lại của chúng ta" defmacro.org/ramblings /fp.html Có rất nhiều sách để bạn mở mang đầu óc: hãy xem Little Schemer để hiểu về Scheme, sau đó chuyển sang phần Cấu trúc và Diễn giải các Chương trình Máy tính.
michiakig

5
@sushil: có rất nhiều tài liệu giới thiệu về chủ đề này. Nói chung, đó là một phong cách lập trình nhấn mạnh việc coi các chương trình như các đối tượng toán học hơn là các lệnh hoặc tương tác tuần tự giữa các đối tượng trừu tượng. Ví dụ: các ngôn ngữ chức năng sẽ ưu tiên lặp lại đệ quy hơn, sử dụng cấu trúc dữ liệu bất biến và sử dụng các hàm bậc cao hơn ưu tiên cho "đối tượng hàm" hoặc "mẫu chiến lược". Các hàm bậc cao hơn nghĩa là các hàm có thể hoạt động trên (dưới dạng đối số) hoặc mang lại (dưới dạng giá trị trả về) các hàm khác.
Derrick Turk

48

Nói một cách đơn giản, ngôn ngữ lambda là ngôn ngữ cho phép truyền một hàm sang một hàm khác, trong đó hàm được coi như bất kỳ biến nào khác. Ngoài ra, bạn sẽ có thể xác định chức năng này được truyền ẩn danh (hoặc nội tuyến). PHP 5.3 hỗ trợ thêm cho các hàm lambda. JavaScript có phải là ngôn ngữ chính thống đầu tiên không? Lisp đã được sử dụng rộng rãi trong các môi trường giáo dục trước JavaScript và cũng như trong việc tùy chỉnh Emacs yêu quý của chúng tôi http://www.gnu.org/software/emacs/manual/html_node/eintr/

Đây là một ví dụ

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Nó khác với C như thế nào? Trong C, bạn có thể chuyển con trỏ đến các hàm, nhưng bạn không thể định nghĩa nó nội tuyến một cách ẩn danh.

Trong Java (trước phiên bản 8), để đạt được hiệu quả tương tự, bạn phải chuyển một đối tượng triển khai một giao diện, giao diện này thực sự có thể được định nghĩa nội tuyến ẩn danh.


1
"Lisp đã được sử dụng rộng rãi" bởi ai? Tôi luôn biết về nó, vì các giáo sư luôn thảo luận về nó, nhưng trên thực tế, tôi chưa bao giờ gặp bất kỳ ai sử dụng Lisp. Tôi có thể nói rằng bất cứ ai cũng có thể tìm thấy một người mà họ biết đã sử dụng Javascript, điều này làm cho Javascript trở nên "chính thống" hơn nhiều.
palswim

"PHP 5 đã thêm hỗ trợ cho các hàm lambda". Trên thực tế, tôi là PHP 5.3 đã giới thiệu các hàm lambda.
Crozin

Tôi đã gặp một vài người sử dụng nó trong bối cảnh kinh doanh, nhưng giống như Pascal đã từng, nó được sử dụng rộng rãi trong các môi trường giáo dục.
Juan Mendes

4

Anh ấy đề cập đến phép tính Lambda .

Giải tích Lambda, còn được viết là λ-Calculus, là một hệ thống chính thức để định nghĩa hàm, ứng dụng hàm và đệ quy. [...]

[...] với phép tính lambda không định kiểu là nguồn cảm hứng ban đầu cho lập trình hàm, đặc biệt là Lisp, và phép tính lambda có kiểu đóng vai trò là nền tảng cho các hệ thống kiểu hiện đại.


4

Tôi đã thấy một lambda được định nghĩa là một hàm ẩn danh và là một tham chiếu đến một hàm. Javascript hỗ trợ cả hai:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

Đây là nơi JS nhận được rất nhiều sức mạnh và tính linh hoạt của nó. Java hỗ trợ cái đầu tiên ở một mức độ nào đó (triển khai giao diện ẩn danh), nhưng không hỗ trợ cái sau - xem bên dưới để biết bản cập nhật cho Java 8.

Tôi không rõ cái nào (hoặc cả hai) trong số này là định nghĩa thích hợp của lambda.

JS chắc chắn không phải là ngôn ngữ đầu tiên hỗ trợ các tính năng này. Đi từ trí nhớ, tôi nghĩ rằng nó nhỏ mà những người đam mê ngôn ngữ luôn say mê hỗ trợ lambdas.

BTW: Trong Java, một lớp ẩn danh thường được sử dụng để truyền một cách nhanh chóng định nghĩa lớp cho một đối số (được sử dụng rất nhiều trong swing). Một cái gì đó như thế này (từ bộ nhớ, không được biên dịch):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Cập nhật

Java, kể từ 8, bây giờ chính thức là một ngôn ngữ Lambda.

Bây giờ bạn có thể sử dụng cú pháp sau:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Nguồn mã


1

Trong kho khóa học mở của MIT được gọi là cấu trúc và giải thích các chương trình máy tính, một cuốn sách của Hal Abelson, Jerry Sussman và Julie Sussman's. Họ thảo luận về Scheme, là một phương ngữ của LISP và ở đó họ giải thích rất chi tiết và rõ ràng về lambda là gì và Scheme LISP và các ngôn ngữ nói chung. Tôi thực sự khuyên bạn nên xem nó nếu bạn muốn có một hiểu biết thực sự rõ ràng và sâu sắc về Lập trình máy tính. Để giải thích cho bạn sẽ mất thời gian gấp ba lần nếu bạn đến đó và chỉ đọc sách hoặc xem hướng dẫn giải thích nó một cách hoàn hảo, đó là thiên tài.

Javascript chủ yếu dựa trên Lược đồ ngôn ngữ và nó là cha đẻ của Lisp, và ngoài ra nó còn lấy cấu trúc lamda và trở thành xu hướng chủ đạo với nó.


0

Từ wikipedia: Trong các ngôn ngữ lập trình như Lisp và Python, lambda là một toán tử được sử dụng để biểu thị các hàm ẩn danh hoặc các bao đóng, sau cách sử dụng phép tính lambda. Một ví dụ về việc sử dụng lambda trong ngôn ngữ Python là phần mã máy tính này sắp xếp danh sách theo thứ tự bảng chữ cái theo ký tự cuối cùng của mỗi mục nhập:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements

0
  • JavaScript cho phép xác định hàm Ẩn danh là một hàm không bị ràng buộc với một mã định danh. Hàm như vậy còn được gọi là Lambda Abstraction và vì JS hỗ trợ nó nên nó được gọi là Lambda Language.

  • Thuộc tính: Chức năng này cần thiết trong trường hợp thực thi ngay một chức năng hoặc để sử dụng trong thời gian ngắn, khi việc đặt tên cho chức năng không có ý nghĩa.

  • Nó khác với các ngôn ngữ như Java, C, C ++ và PHP như trong JS, các hàm ẩn danh được sử dụng cho Closure và Currying.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.