Perbedaan antara Fungsi Kelas Pertama dan Fungsi Tingkat Tinggi


Jawaban:


154

Ada perbedaan. Ketika Anda mengatakan bahwa suatu bahasa memiliki fungsi kelas satu, itu berarti bahwa bahasa tersebut memperlakukan fungsi sebagai nilai - bahwa Anda dapat menetapkan suatu fungsi ke dalam suatu variabel, menyebarkannya, dll. Fungsi tingkat tinggi adalah fungsi yang bekerja pada fungsi lain, artinya bahwa mereka mengambil satu atau lebih fungsi sebagai argumen dan juga dapat mengembalikan fungsi.

Konsep "orde tinggi" dapat diterapkan ke fungsi secara umum, seperti fungsi dalam arti matematika. Konsep "kelas satu" hanya berkaitan dengan fungsi-fungsi dalam bahasa pemrograman. Ini jarang digunakan ketika merujuk ke suatu fungsi, seperti "fungsi kelas satu". Adalah jauh lebih umum untuk mengatakan bahwa “suatu bahasa memiliki / belum mendukung fungsi kelas satu”.

Kedua hal ini sangat terkait, karena sulit membayangkan bahasa dengan fungsi kelas satu yang tidak juga akan mendukung fungsi tingkat tinggi, dan sebaliknya bahasa dengan fungsi tingkat tinggi tetapi tanpa dukungan fungsi kelas satu.


2
Saya pikir satu hal yang membuat saya mudah bingung adalah mereka terkait erat.
Simon

63
@Simon Saya pikir kunci untuk menghindari kebingungan adalah dengan mengingat bahwa bahasa dapat memiliki fungsi kelas satu (Anda juga dapat berbicara tentang "kelas satu" hal-hal lain, seperti kelas kelas satu, dll), atau tidak. Jadi, Anda tidak pernah membicarakan fungsi tertentu sebagai kelas satu atau tidak. OTOH, ketika Anda mengatakan suatu fungsi lebih tinggi atau tidak, itu hanya mengatakan apakah itu berfungsi atau tidak, jadi "tingkat tinggi" adalah properti dari masing-masing fungsi individu. Jadi "memiliki fungsi kelas" adalah properti dari suatu bahasa, dan "lebih tinggi" adalah properti dari suatu fungsi.
Ben

Tepat Ben. Saya berpikir keduanya adalah properti untuk fungsi maka saya bingung. Terima kasih atas komentar Anda.
Simon

Juga, baik untuk diingat bahwa "fungsi kelas satu" TIDAK sama dengan dukungan penutupan. Misalnya, di C mendukung "fungsi kelas" melalui pointer fungsi. Namun, C tidak mendukung gagasan fungsi bersarang, dan karenanya, tidak mendukung penutupan.
Tac-Tics

1
@ Tac-Tics definisi pasti subyektif dan terbuka untuk diperdebatkan, tapi saya pribadi lebih suka berpikir bahwa C hanya mendukung fungsi urutan yang lebih tinggi (melalui pointer fungsi). Namun, fungsi kelas satu tidak didukung karena fungsi lebih rendah daripada tipe nilai lain seperti intatau char, dalam arti bahwa mereka tidak dapat didefinisikan secara eksplisit (oleh badan fungsi) di mana pun Anda inginkan.
wlnirvana

67

Fungsi kelas satu adalah fungsi yang diperlakukan seperti objek (atau dapat ditugaskan ke variabel).

Fungsi urutan lebih tinggi adalah fungsi yang mengambil setidaknya satu fungsi kelas pertama sebagai parameter, atau mengembalikan setidaknya satu fungsi kelas satu.


20

Mereka berbeda.

Fungsi kelas satu

Nilai-nilai dalam bahasa yang ditangani secara seragam disebut "kelas satu". Mereka dapat disimpan dalam struktur data, diteruskan sebagai argumen, atau digunakan dalam struktur kontrol.

Bahasa yang mendukung nilai dengan tipe fungsi, dan memperlakukannya sama dengan nilai non-fungsi, dapat dikatakan memiliki "fungsi kelas satu".

Fungsi urutan lebih tinggi

Salah satu konsekuensi dari memiliki fungsi kelas satu adalah bahwa Anda harus dapat melewati suatu fungsi sebagai argumen ke fungsi lain. Fungsi terakhir sekarang "urutan lebih tinggi". Ini adalah fungsi yang mengambil fungsi sebagai argumen.

Contoh kanonik adalah "peta"

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

Artinya, dibutuhkan fungsi, dan array, dan mengembalikan array baru dengan fungsi yang diterapkan ke setiap elemen.

Bahasa fungsional - bahasa di mana fungsi adalah sarana utama untuk membangun program - semua memiliki fungsi kelas satu. Sebagian besar juga memiliki fungsi urutan yang lebih tinggi (pengecualian yang sangat jarang adalah bahasa seperti Excel, yang dapat dikatakan fungsional, tetapi bukan urutan yang lebih tinggi).


1
Terima kasih, Don. Ini komprehensif. Dan saya pikir fase "Salah satu konsekuensi" menunjukkan semacam hubungan antara keduanya.
Simon

10

Selain jawaban sebelumnya, perhatikan bahwa bahasa dengan fungsi kelas satu secara otomatis memungkinkan ekspresi fungsi tingkat tinggi (karena Anda dapat meneruskan fungsi sebagai parameter seperti nilai lainnya).

Di sisi lain, Anda dapat membayangkan bahasa yang mendukung fungsi tingkat tinggi, tetapi jangan membuat fungsi kelas satu (dan di mana parameter yang merupakan fungsi diperlakukan secara khusus, dan berbeda dari parameter nilai "biasa").

Jadi kehadiran fungsi kelas satu (sebagai fitur bahasa) menyiratkan adanya fungsi tingkat tinggi, tetapi tidak sebaliknya.


Bisakah Anda memberi contoh di mana fungsi urutan yang lebih tinggi bukan fungsi kelas satu. (Saya pikir keduanya sama.)
ATHER

@ AYAT, saya tidak punya contoh konkret dari bahasa yang akan membuat pilihan desain untuk fungsi seperti itu. Tetapi sesuatu yang serupa adalah contohnya misalnya dengan templat di C ++: templat lebih tinggi (Anda dapat memiliki "parameter templat templat"), tetapi bukan nilai-nilai kelas pertama, yaitu templat tidak dapat menjadi parameter untuk fungsi biasa. Demikian pula dengan misalnya modul / functors dalam ML.
Andreas Rossberg

@AndreasRossberg Tidakkah Java 8 menjadi jawaban yang valid untuk pertanyaannya? Fungsi bukan warga negara kelas satu, tetapi metode Java dapat menerima fungsi (melalui antarmuka fungsional), seperti yang dijelaskan oleh Anda sebagai "parameter fungsi yang diperlakukan secara khusus, dan berbeda dari parameter nilai" biasa "."
Abdul

1

Fungsi Kelas Satu dapat:

  • Disimpan dalam variabel
  • Dikembalikan dari fungsi.
  • Disahkan sebagai argumen ke fungsi lain.

Fungsi Orde Tinggi adalah fungsi yang mengembalikan fungsi lain.

Sebagai contoh:

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

0

Fungsi kelas pertama berarti segala sesuatu yang dapat Anda lakukan dengan tipe lain (variabel, boolean, angka ...), Anda dapat melakukannya dengan fungsi.

Misalnya Tetapkan mereka ke variabel, sebarkan di sekitar, buat dengan cepat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.