Birinci Sınıf İşlev ve Yüksek Sıralı İşlev arasındaki herhangi bir fark


Yanıtlar:


154

Bir fark var. Bir dilin birinci sınıf işlevlere sahip olduğunu söylediğinizde, bu, dilin işlevleri değer olarak ele aldığı anlamına gelir - bir değişkene bir işlev atayabilir, onu başka bir yere aktarabilirsiniz vb. Yüksek dereceli işlevler, diğer işlevler üzerinde çalışan işlevlerdir. argüman olarak bir veya daha fazla işlevi alırlar ve ayrıca bir işlev döndürebilirler.

"Üst düzey" kavramı, matematiksel anlamda işlevler gibi genel olarak işlevlere uygulanabilir. "Birinci sınıf" konseptin yalnızca programlama dillerindeki işlevlerle ilgisi vardır. "Birinci sınıf işlev" gibi bir işleve atıfta bulunurken nadiren kullanılır. "Bir dilin birinci sınıf işlev desteğine sahip / yok" demek çok daha yaygındır.

Bu iki şey yakından ilişkilidir, çünkü birinci sınıf işlevlere sahip ve üst düzey işlevleri desteklemeyen bir dil ve tersine daha yüksek düzey işlevlere sahip ancak birinci sınıf işlev desteği olmayan bir dil hayal etmek zor.


2
Sanırım beni kolayca karıştıran bir şey, birbirleriyle yakından ilişkili olmaları.
Simon

63
@Simon Bence kafa karışıklığını önlemenin anahtarı, bir dilin birinci sınıf işlevlere sahip olduğunu (birinci sınıf sınıflar gibi "birinci sınıf" diğer şeyler hakkında da konuşabilirsiniz) veya olmadığını hatırlamaktır. Yani belirli bir işlevin birinci sınıf olup olmadığı hakkında asla konuşmazsınız . OTOH, bir fonksiyonun daha yüksek mertebe olup olmadığını söylediğinizde, sadece fonksiyonlar üzerinde çalışıp çalışmadığını söyler, yani "daha yüksek mertebeden" her bir fonksiyonun bir özelliğidir. Dolayısıyla, "birinci sınıf işlevlere sahiptir" bir dilin bir özelliğidir ve "daha yüksek mertebedir" bir işlevin özelliğidir.
Ben

Kesinlikle Ben. Bu ikisinin de işlev için bir özellik olduğunu düşünüyordum, bu yüzden kafam karıştı. Yorumlarınız için teşekkürler.
Simon

Ayrıca, "birinci sınıf işlevlerin" kapatma desteği ile aynı OLMADIĞINI akılda tutmak iyi olur. Örneğin, C'de işlev işaretçileri aracılığıyla "birinci sınıf işlevleri" destekler. Bununla birlikte, C herhangi bir iç içe geçmiş işlev kavramını desteklemez ve bu nedenle, kapanışları desteklemez.
Tac-Tics

1
@ Tac-Tics tanımlar kesinlikle özneldir ve tartışmaya açıktır, ancak kişisel olarak C'nin yalnızca daha yüksek dereceli işlevleri desteklediğini düşünmeyi tercih ederim (işlev işaretçileri aracılığıyla). Bununla birlikte, birinci sınıf işlevler desteklenmez, çünkü işlevler intveya gibi diğer değer türlerinden daha düşüktür char, yani istediğiniz yerde açıkça tanımlanamazlar (bir işlev gövdesi tarafından).
wlnirvana

67

Birinci sınıf fonksiyonlar , bir nesne gibi ele alınan (veya bir değişkene atanabilen) fonksiyonlardır.

Daha yüksek dereceli işlevler , parametre olarak en az bir birinci sınıf işlevi alan veya en az bir birinci sınıf işlev döndüren işlevlerdir.


20

Farklılar.

Birinci sınıf işlevler

Bir dilde aynı şekilde işlenen değerler "birinci sınıf" olarak adlandırılır. Veri yapılarında depolanabilir, bağımsız değişken olarak iletilebilir veya kontrol yapılarında kullanılabilirler.

Değerleri işlev türleriyle destekleyen ve bunları işlev dışı değerlerle aynı şekilde ele alan dillerin "birinci sınıf işlevlere" sahip olduğu söylenebilir.

Daha yüksek dereceli fonksiyonlar

Birinci sınıf işlevlere sahip olmanın sonuçlarından biri, bir işlevi başka bir işleve argüman olarak iletebilmeniz gerektiğidir. İkinci işlev artık "üst düzey" dir. Bağımsız değişken olarak bir işlevi alan bir işlevdir.

Kanonik örnek "harita" dır

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

Yani, bir işlevi ve bir diziyi alır ve her öğeye uygulanan işlevle yeni bir dizi döndürür.

İşlevsel diller - işlevlerin program oluşturmanın birincil aracı olduğu diller - tümünün birinci sınıf işlevleri vardır. Çoğunun daha yüksek düzey işlevleri de vardır (çok nadir istisnalar Excel gibi dillerdir, bu dillerin işlevsel olduğu söylenebilir, ancak üst düzey değildir).


1
Teşekkürler Don. Kapsamlıdır. Ve bence "Sonuçlardan biri" aşaması bu ikisi arasındaki bir tür ilişkiyi gösteriyor.
Simon

10

Önceki yanıtlara ek olarak, birinci sınıf işlevlere sahip bir dilin otomatik olarak üst düzey işlevlerin ifadesini etkinleştirdiğini unutmayın (çünkü işlevleri başka herhangi bir değer gibi parametreler olarak geçirebilirsiniz).

Öte yandan, üst düzey işlevleri destekleyen, ancak birinci sınıf işlevler yapmayan (ve işlevler olan parametrelerin özel olarak ele alındığı ve "sıradan" değer parametrelerinden farklı olduğu) diller hayal edebilirsiniz.

Dolayısıyla, birinci sınıf işlevlerin varlığı (bir dil özelliği olarak), üst düzey işlevlerin varlığına işaret eder, ancak tersi değildir.


Daha yüksek dereceden bir fonksiyonun birinci sınıf bir fonksiyon olmadığı bir örnek verebilir misiniz? (
İkisinin

@ATHER, bu tür işlevler için böyle bir tasarım seçimi yapacak somut bir dil örneğim yok. Ancak, C ++ 'daki şablonlarda da benzer bir durum söz konusudur: şablonlar daha yüksek sıralıdır ("şablon şablon parametrelerine" sahip olabilirsiniz), ancak birinci sınıf değerler olamaz, yani şablonlar, sıradan işlevlerin parametreleri olamaz. Benzer şekilde, örneğin ML'deki modüller / functors ile.
Andreas Rossberg

@AndreasRossberg Java 8 sorusuna geçerli bir cevap olmaz mı? İşlevler birinci sınıf vatandaş değildir, ancak Java yöntemleri, sizin tarafınızdan "işlevler özel olarak ele alınan ve" sıradan "değer parametrelerinden farklı olan parametreler" olarak tanımlandığı gibi işlevleri (işlevsel arabirimler aracılığıyla) alabilir.
Abdul

1

Birinci Sınıf işlevler şunları yapabilir:

  • Değişkenlerde saklanmalıdır
  • Bir işlevden döndürülür.
  • Bağımsız değişkenler olarak başka bir işleve geçirilebilir.

Yüksek Sıralı İşlev , başka bir işlevi döndüren bir işlevdir.

Örneğin:

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

0

Birinci sınıf işlevler, diğer türlerle (değişkenler, mantıksal değerler, sayılar ...) yapabileceğiniz her şeyi ifade eder, bunu işlevlerle yapabilirsiniz.

Örneğin, değişkenlere atayın, iletin, anında oluşturun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.