chức năng lambda ẩn danh (lập trình chức năng)


10

Hàm nặc danh (lambda) là gì? Định nghĩa chính thức của một chức năng ẩn danh trong ngôn ngữ lập trình chức năng là gì?

Nói một cách đơn giản, khi tôi đang lập trình theo sơ đồ / lisp tôi sẽ nói một hàm ẩn danh (lambda) là một hàm không bị ràng buộc với một định danh.

Đó có phải là tất cả những gì bạn có thể nói chính thức về chức năng lambda? Tôi nghĩ có nhiều chi tiết có thể được thêm vào định nghĩa đơn giản này. Xin hãy giải thích, và cảm ơn bạn!


Câu trả lời:


10

Theo tôi, đó là tất cả những gì bạn thực sự có thể nói về họ.

Ý tưởng là trong một ngôn ngữ bậc cao hơn, một hàm chỉ là một loại giá trị khác. Giống như cách bạn có thể có (3 + 4) mà không cần mã định danh trong C, bạn có thể có (lambda (x) + (3 x))) mà không cần mã định danh trong sơ đồ.

Chìa khóa ở đây không phải là có gì đặc biệt về các chức năng ẩn danh. Chỉ có các hạn chế của các ngôn ngữ khác yêu cầu chức năng được xử lý khác với bất kỳ giá trị nào khác. Các định nghĩa đặc biệt dành cho các ngôn ngữ thủ tục không cho phép chúng, không dành cho các ngôn ngữ chức năng.


11

Trong phép tính lambda, tất cả các hàm (thuật ngữ) là ẩn danh. Đây là một thuộc tính thiết yếu của phép tính lambda: bạn có thể soạn các hàm phức tạp từ các hàm đơn giản hơn mà không cần đặt tên cho chúng.

Trong các ngôn ngữ lập trình, trong hầu hết các trường hợp, mong muốn đặt tên cho các hàm, bởi vì đây là cách chúng ta nghĩ và nó làm cho mã có thể đọc được cho con người. Nhưng việc biên dịch cuối cùng sẽ loại bỏ các tên khi tạo ra một tệp thực thi (nếu chúng ta bỏ qua thông tin gỡ lỗi).

Nếu một ngôn ngữ cho phép biểu thị các hàm ẩn danh (đó là các hàm không có tên), nó có thể mang lại lợi thế cho cả lập trình viên và trình biên dịch: Lập trình viên thường có thể viết mã ngắn hơn và trình biên dịch có thể tối ưu hóa tốt hơn, biết rằng một hàm ẩn danh chỉ được sử dụng tại nơi và không phải bất cứ nơi nào khác.


1

Nó phụ thuộc vào phần nào trong câu hỏi của bạn mà bạn nhấn mạnh. Nếu nó đặc biệt là thuộc tính ẩn danh cho các hàm ẩn danh, thì thực sự câu trả lời duy nhất là chúng là các giá trị không bị ràng buộc . Nếu bạn đang nói về các hàm nói chung, các hàm ẩn danh có lẽ là biểu hiện rõ ràng nhất của việc sử dụng phép tính lambda trong một cài đặt chức năng, cho các ngôn ngữ ứng dụng .

Trong thực tế, từ quan điểm tính toán lambda, biểu thức lambda là cấu trúc cú pháp được sử dụng để tạo ra các ràng buộc. Nhớ lại ký hiệu được sử dụng trong phép tính lambda:

λf.λx.fx

fxfx

Một ngôn ngữ thường cung cấp các cách, chẳng hạn như let(ML như ngôn ngữ, lược đồ) hoặc define(lược đồ) để tạo các ràng buộc có thể sử dụng ở cấp cao nhất (hoặc trong cấu trúc cú pháp phức tạp hơn các hàm, như mô-đun hoặc đối tượng), nhưng là công cụ cần thiết duy nhất cho ràng buộc là lambda ở cấp thấp hơn.

Nếu bạn nhìn vào các ngôn ngữ như sơ đồ hoặc phương ngữ không thể thiếu, chính nguồn tài trợ của chúng là lambda tính toán, và nhiều hình thức đặc biệt là lambdas bọc đường thực sự.

Đối với các ngôn ngữ nối , câu chuyện hơi khác nhau. Lambdas là không cần thiết, và thực sự phản tác dụng. Điểm xác định lambdas ẩn danh là gì, khi mọi thứ là một chức năng ?

Có một sự đối ngẫu nào đó giữa hai loại xoài này. Cái sau tập trung vào sự kết hợp chức năng tự do điểm và do đó cố gắng biểu diễn mọi thứ dưới dạng hàm, trong khi cái trước hoạt động trên một phép tính phức tạp hơn và nỗ lực để có các hàm như các giá trị hạng nhất, giống như bất kỳ giá trị nào khác của ngôn ngữ. Về mặt này, người ta có thể xem lambdas là kết quả của nỗ lực đó.

Một số gợi ý về chủ đề được giới thiệu (kém) trong câu trả lời này:

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.