2012-04-13 45 views

Trả lời

103

Có sự khác biệt. Khi bạn nói rằng một ngôn ngữ có các hàm hạng nhất, điều đó có nghĩa là ngôn ngữ xử lý các hàm như là các giá trị - bạn có thể gán một hàm vào một biến, chuyển nó qua các hàm khác. Hàm bậc cao là các hàm hoạt động trên các hàm khác, có nghĩa là họ lấy một hoặc nhiều hàm làm đối số và cũng có thể trả về một hàm.

Khái niệm “bậc cao hơn” có thể được áp dụng cho các chức năng nói chung, giống như các hàm theo nghĩa toán học. Khái niệm “hạng nhất” chỉ liên quan đến các hàm trong ngôn ngữ lập trình. Nó hiếm khi được sử dụng khi đề cập đến một chức năng, chẳng hạn như “chức năng hạng nhất”. Có nhiều điều thông dụng hơn khi nói rằng "một ngôn ngữ có/không có hỗ trợ chức năng hạng nhất".

Hai điều này có liên quan chặt chẽ, vì khó có thể tưởng tượng ngôn ngữ có chức năng hạng nhất cũng không hỗ trợ chức năng bậc cao hơn, và ngược lại với ngôn ngữ có hàm bậc cao hơn nhưng không hỗ trợ chức năng hạng nhất.

+2

Tôi nghĩ rằng có một điều làm cho tôi dễ dàng bị nhầm lẫn là họ có liên quan chặt chẽ. – Simon

+33

@Simon Tôi nghĩ rằng chìa khóa để tránh nhầm lẫn là phải nhớ rằng một ngôn ngữ có chức năng hạng nhất (bạn cũng có thể nói về những thứ khác "hạng nhất", như lớp học đầu tiên, vv), hoặc nó không . Vì vậy, bạn không bao giờ nói về ** một chức năng cụ thể ** là hạng nhất hay không. OTOH, khi bạn nói một hàm có thứ tự cao hơn hay không, điều đó chỉ nói rằng nó có hoạt động trên các hàm hay không, vì vậy "thứ tự cao hơn" là thuộc tính của từng hàm riêng lẻ. Vì vậy, "có chức năng hạng nhất" là thuộc tính của một ngôn ngữ và "là thứ tự cao hơn" là thuộc tính của hàm. – Ben

+0

Chính xác Ben. Tôi đã nghĩ rằng cả hai đều là một tài sản cho chức năng vì vậy tôi đã nhầm lẫn. Cảm ơn ý kiến ​​của bạn. – Simon

37

Chức năng lớp học đầu tiên là các hàm được xử lý như đối tượng (hoặc có thể gán cho biến).

Hàm đặt hàng cao hơn là các hàm có ít nhất một hàm lớp đầu tiên làm tham số.

16

Chúng khác nhau.

chức năng First class

giá trị bằng một ngôn ngữ mà được xử lý thống nhất trong cả được gọi là "hạng nhất". Chúng có thể được lưu trữ trong các cấu trúc dữ liệu, được chuyển thành các đối số hoặc được sử dụng trong các cấu trúc điều khiển.

Các ngôn ngữ hỗ trợ các giá trị có loại hàm và xử lý chúng giống như giá trị không có chức năng, có thể được gọi là "hàm hạng nhất".

cao chức năng để

Một trong những hậu quả của việc có chức năng hạng nhất là bạn sẽ có thể vượt qua một chức năng như một đối số chức năng khác. Hàm thứ hai bây giờ là "thứ tự cao hơn". Nó là hàm nhận hàm làm đối số.

Ví dụ kinh điển là "bản đồ"

map :: (a -> b) -> [a] -> [b] 
map f []  = [] 
map f (x:xs) = f x : map f xs 

Đó là, phải mất một chức năng, và một mảng, và trả về một mảng mới với chức năng áp dụng cho từng yếu tố.

Ngôn ngữ chức năng - ngôn ngữ trong đó chức năng là phương tiện chính để xây dựng chương trình - tất cả đều có chức năng lớp học đầu tiên. Hầu hết cũng có chức năng bậc cao hơn (ngoại lệ rất hiếm là các ngôn ngữ như Excel, có thể nói là chức năng, nhưng không phải là thứ tự cao hơn).

+1

Cảm ơn Don. Nó toàn diện. Và tôi nghĩ giai đoạn "Một trong những hậu quả" cho thấy một mối quan hệ giữa hai người đó. – Simon

9

Ngoài các câu trả lời trước, lưu ý rằng một ngôn ngữ với các chức năng hạng nhất tự động cho phép sự biểu hiện của chức năng bậc cao (vì bạn có thể vượt qua chức năng như các thông số như bất kỳ giá trị khác). Mặt khác, bạn có thể tưởng tượng các ngôn ngữ hỗ trợ các hàm bậc cao hơn, nhưng không tạo hàm hạng nhất (và các tham số được xử lý đặc biệt và khác với tham số giá trị "thông thường").

Vì vậy, sự hiện diện của chức năng hạng nhất (như là một tính năng ngôn ngữ) ngụ ý sự hiện diện của các chức năng bậc cao, nhưng không phải là chiều ngược lại.

+0

Bạn có thể đưa ra ví dụ trong đó hàm bậc cao không phải là hàm lớp đầu tiên. (Tôi nghĩ cả hai đều giống nhau.) – ATHER

+0

@ATHER, tôi không có một ví dụ cụ thể về ngôn ngữ sẽ tạo ra sự lựa chọn thiết kế cho các chức năng như vậy. Nhưng điều tương tự là trường hợp, ví dụ: với mẫu trong C++: mẫu có thứ tự cao hơn (bạn có thể có "tham số mẫu mẫu"), nhưng không phải là giá trị lớp đầu tiên, tức là, mẫu không thể là tham số cho hàm bình thường. Tương tự, ví dụ: modules/functors trong ML. –

+0

@AndreasRossberg Java 8 có phải là câu trả lời hợp lệ cho câu hỏi của anh không? Các hàm không phải là công dân hạng nhất, nhưng các phương thức Java có thể nhận các hàm (thông qua các giao diện chức năng), như được mô tả bởi bạn là "các tham số được xử lý đặc biệt và khác với tham số giá trị" thông thường ". – Abdul

0

chức năng First class có nghĩa là tất cả mọi thứ bạn có thể làm với các loại khác (các biến, các phép toán luận, số điện thoại ...), bạn có thể làm điều đó với các chức năng.

Ví dụ Gán họ biến, vượt qua nó xung quanh, tạo cho họ trên con ruồi.

Các vấn đề liên quan