Như tôi hiểu, trong các ngôn ngữ như Haskell, và cũng như một phần của phép tính lambda, mỗi biểu thức lambda có phạm vi riêng của nó, vì vậy nếu tôi có các biểu thức lambda lồng nhau như: \x -> (\x -> x)
thì tham số \x
đầu tiên khác với tham số thứ hai \x
. Trong Java nếu bạn làm điều này bạn nhận được một lỗi biên dịch, giống như nếu bạn sử dụng x
một lần nữa làm tên thông số hoặc tên biến cục bộ trong lambda nếu nó đã được sử dụng bên trong phạm vi kèm theo, ví dụ: dưới dạng tham số phương thức.Tại sao các biểu thức lambda java không đưa ra một mức độ phạm vi mới?
Không ai biết tại sao Java thực hiện các biểu thức lambda theo cách này - tại sao không để chúng giới thiệu cấp độ phạm vi mới và hoạt động giống như một lớp ẩn danh? Tôi cho rằng đó là do một số hạn chế hoặc tối ưu hóa, hoặc có thể vì lambdas đã bị hack vào ngôn ngữ hiện tại?
Làm thế nào để bạn tham khảo các x ngoài trong lambda lồng nhau bằng các ngôn ngữ như vậy? –
@SotiriosDelimanolis Bạn không nhất thiết phải có khả năng, đây là một quyết định thiết kế. Bạn có thể e. g. cũng không truy cập vào biến cục bộ x từ một lớp ẩn danh, nơi bạn định nghĩa một x khác hoàn toàn hợp lệ. – Vampire
Có thể trùng lặp của [Biến đã được xác định trong phương thức lambda] (https://stackoverflow.com/questions/22773003/variable-is-already-defined-in-method-lambda) – ZhekaKozlov