Bất kỳ sự khác biệt giữa Chức năng hạng nhất và Chức năng bậc cao


Câu trả lời:


154

Có một 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ữ coi các hàm là các giá trị - rằng bạn có thể gán một hàm thành một biến, chuyển nó xung quanh, v.v. Các hàm bậc cao hơn là các hàm hoạt động trên các hàm khác, nghĩa là rằng 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 cấp bậc cao hơn có thể được áp dụng cho các hàm 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 của Wikipedia chỉ có liên quan đến các chức năng trong các 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ư một chức năng hạng nhất. Điều phổ biến hơn nhiều khi nói rằng ngôn ngữ có / không có chức năng hạng nhất hỗ trợ.

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


2
Tôi nghĩ một điều khiến tôi dễ nhầm lẫn là chúng có liên quan mật thiết với nhau.
Simon

63
@Simon Tôi nghĩ rằng chìa khóa để tránh nhầm lẫn là hãy 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ư các lớp hạng nhất, v.v.) hoặc 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, nó chỉ nói rằng nó có hoạt động trên các hàm hay không, vì vậy "bậc cao hơn" là một thuộc tính của từng hàm riêng lẻ. Vì vậy, "có các hàm hạng nhất" là một thuộc tính của ngôn ngữ và "là thứ tự cao hơn" là một thuộc tính của hàm.
Ben

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

Ngoài ra, bạn nên nhớ rằng "các chức năng hạng nhất" KHÔNG giống như hỗ trợ đóng. Ví dụ, trong C hỗ trợ "các hàm hạng nhất" thông qua các con trỏ hàm. Tuy nhiên, C không hỗ trợ bất kỳ khái niệm nào về hàm lồng nhau, và do đó, không hỗ trợ các bao đóng.
Tac-Tics

1
@ Tac-Tics các định nghĩa chắc chắn là chủ quan và mở để tranh luận, nhưng cá nhân tôi thích nghĩ rằng C chỉ hỗ trợ các hàm bậc cao hơn (thông qua các con trỏ hàm). Tuy nhiên, các hàm hạng nhất không được hỗ trợ vì các hàm kém hơn các loại giá trị khác như inthoặc char, theo nghĩa là chúng không thể được xác định rõ ràng (bởi một thân hàm) bất cứ nơi nào bạn muốn.
wlnirvana

67

Các hàm hạng nhất là các hàm được xử lý như một đối tượng (hoặc có thể gán cho một biến).

Các hàm bậc cao hơn là các hàm lấy ít nhất một hàm hạng nhất làm tham số hoặc trả về ít nhất một hàm hạng nhất.


20

Chúng khác nhau.

Chức năng hạng nhất

Các giá trị trong một ngôn ngữ được xử lý thống nhất trong suốt đượ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 truyền dưới dạng đố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ị với các loại hàm và coi chúng giống như các giá trị phi hàm, có thể nói là có "các hàm hạng nhất".

Chức năng bậc cao

Một trong những hậu quả của việc có các hàm hạng nhất là bạn sẽ có thể truyền một hàm làm đối số cho một hàm khác. Hàm thứ hai bây giờ là "bậc cao hơn". Nó là một hàm lấy một 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à, nó lấy một hàm và một mảng và trả về một mảng mới với hàm được áp dụng cho mỗi phần tử.

Ngôn ngữ chức năng - ngôn ngữ nơi 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 hạng nhất. Hầu hết cũng có các hàm 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à hàm, nhưng không phải là bậc 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ả" chỉ ra một loại mối quan hệ giữa hai người đó.
Simon

10

Ngoài các câu trả lời trước, lưu ý rằng một ngôn ngữ có chức năng hạng nhất sẽ tự động cho phép biểu hiện các hàm bậc cao hơn (vì bạn có thể truyền các hàm dưới dạng tham số như bất kỳ giá trị nào 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 các hàm hạng nhất (và trong đó các tham số là các hàm được xử lý đặc biệt và khác với các tham số giá trị "thông thường").

Vì vậy, sự hiện diện của các chức năng hạng nhất (như 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à cách khác.


Bạn có thể vui lòng cho một ví dụ trong đó hàm bậc cao hơn không phải là hàm hạng nhất. (Tôi nghĩ cả hai đều giống nhau.)
ather

@ DAER, tôi không có một ví dụ cụ thể về ngôn ngữ sẽ đưa ra lựa chọn thiết kế như vậy cho các chức năng như vậy. Nhưng một cái gì đó tương tự là trường hợp, ví dụ với các mẫu trong C ++: cá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ị hạng nhất, nghĩa là các mẫu không thể là tham số cho các hàm thông thường. Tương tự với các mô-đun / functor trong ML.
Andreas Rossberg

@AndreasRossberg Java 8 sẽ không phải là một câu trả lời hợp lệ cho câu hỏi của anh ấy chứ? 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 bạn mô tả là "các tham số là các hàm được xử lý đặc biệt và khác với các tham số giá trị" thông thường ".
Abdul

1

Các chức năng hạng nhất có thể:

  • Được lưu trữ trong các biến
  • Được trả về từ một chức năng.
  • Được thông qua như là đối số vào một chức năng khác.

Hàm thứ tự cao là một hàm trả về một hàm khác.

Ví dụ:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

Các hàm hạng nhất có nghĩa là mọi thứ bạn có thể làm với các loại khác (biến, booleans, số ...), bạn có thể làm điều đó với các hàm.

Ví dụ: Gán chúng cho các biến, chuyển nó xung quanh, tạo chúng khi đang bay.

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.