Cualquier diferencia entre la función de primera clase y la función de orden superior

Respuestas:

154

Hay una diferencia. Cuando dice que un idioma tiene funciones de primera clase, significa que el lenguaje trata las funciones como valores, que puede asignar una función a una variable, pasarla, etc. Las funciones de orden superior son funciones que funcionan en otras funciones, lo que significa que toman una o más funciones como argumento y también pueden devolver una función.

El concepto de "orden superior" se puede aplicar a las funciones en general, como las funciones en el sentido matemático. El concepto de "primera clase" solo tiene que ver con funciones en lenguajes de programación. Raramente se usa cuando se hace referencia a una función, como "una función de primera clase". Es mucho más común decir que "un idioma tiene / no tiene soporte de funciones de primera clase".

Las dos cosas están estrechamente relacionadas, ya que es difícil imaginar un lenguaje con funciones de primera clase que no admitiera también funciones de orden superior y, a la inversa, un lenguaje con funciones de orden superior pero sin soporte de funciones de primera clase.

zoul
fuente
2
Creo que una cosa que me confunde fácilmente es que están estrechamente relacionados.
Simon
63
@ Simon Creo que la clave para evitar confusiones es recordar que un lenguaje tiene funciones de primera clase (también se puede hablar de otras cosas de "primera clase", como clases de primera clase, etc.) o no. Por lo tanto, nunca se habla de que una función en particular sea ​​de primera clase o no. OTOH, cuando dices que una función es de orden superior o no, eso solo dice si funciona o no en funciones, por lo que el "orden de orden superior" es una propiedad de cada función individual. Entonces "tiene funciones de primera clase" es una propiedad de un lenguaje, y "tiene un orden superior" es una propiedad de una función.
Ben
Exactamente Ben. Estaba pensando que esos dos son una propiedad para la función, por lo tanto, estaba confundido. Gracias sus comentarios
Simon
Además, es bueno tener en cuenta que las "funciones de primera clase" NO son lo mismo que el soporte de cierre. Por ejemplo, en C admite "funciones de primera clase" a través de punteros de función. Sin embargo, C no admite ninguna noción de función anidada y, por lo tanto, no admite cierres.
Tac-Tics
1
@ Tac-Tics las definiciones son ciertamente subjetivas y abiertas a debate, pero personalmente prefiero pensar que C solo admite funciones de orden superior (a través de punteros de función). Sin embargo, las funciones de primera clase no son compatibles porque las funciones son inferiores a otros tipos de valores como into char, en el sentido de que no pueden definirse explícitamente (por un cuerpo de función) donde lo desee.
wlnirvana
67

Las funciones de primera clase son funciones que se tratan como un objeto (o se pueden asignar a una variable).

Las funciones de orden superior son funciones que toman como mínimo una función de primera clase como parámetro o devuelven al menos una función de primera clase.

AshleyS
fuente
20

Son diferentes

Funciones de primera clase

Los valores en un idioma que se manejan de manera uniforme se denominan "primera clase". Pueden almacenarse en estructuras de datos, pasarse como argumentos o usarse en estructuras de control.

Se puede decir que los lenguajes que admiten valores con tipos de función y los tratan igual que los valores que no son de función tienen "funciones de primera clase".

Funciones de orden superior

Una de las consecuencias de tener funciones de primera clase es que debería poder pasar una función como argumento a otra función. La última función es ahora "orden superior". Es una función que toma una función como argumento.

El ejemplo canónico es "mapa"

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

Es decir, toma una función y una matriz, y devuelve una nueva matriz con la función aplicada a cada elemento.

Lenguajes funcionales: los idiomas donde las funciones son los medios principales para crear programas, todos tienen funciones de primera clase. La mayoría también tiene funciones de orden superior (excepciones muy raras son lenguajes como Excel, que se puede decir que son funcionales, pero no de orden superior).

Don Stewart
fuente
1
Gracias don. Es integral. Y creo que la fase "Una de las consecuencias" indica un tipo de relación entre esos dos.
Simon
10

Además de las respuestas anteriores, tenga en cuenta que un lenguaje con funciones de primera clase habilita automáticamente la expresión de funciones de orden superior (porque puede pasar funciones como parámetros como cualquier otro valor).

Por otro lado, puede imaginar lenguajes que admitan funciones de orden superior, pero no hacen que las funciones sean de primera clase (y donde los parámetros que son funciones se tratan especialmente y son diferentes de los parámetros de valores "ordinarios").

Entonces, la presencia de funciones de primera clase (como una característica del lenguaje) implica la presencia de funciones de orden superior, pero no al revés.

Andreas Rossberg
fuente
¿Puede dar un ejemplo en el que una función de orden superior no sea una función de primera clase? (Pensé que ambos son iguales.)
ADRE
@ATHER, no tengo un ejemplo concreto de un lenguaje que haga una elección de diseño para funciones como tal. Pero algo similar es el caso, por ejemplo, con plantillas en C ++: las plantillas son de orden superior (puede tener "parámetros de plantilla de plantilla"), pero no valores de primera clase, es decir, las plantillas no pueden ser parámetros para funciones ordinarias. De manera similar con, por ejemplo, módulos / functores en ML.
Andreas Rossberg el
@AndreasRossberg ¿Java 8 no sería una respuesta válida a su pregunta? Las funciones no son ciudadanos de primera clase, pero los métodos Java pueden recibir funciones (a través de interfaces funcionales), como usted describe como "los parámetros que son funciones se tratan especialmente y son diferentes de los parámetros de valor" ordinarios ".
Abdul
1

Las funciones de primera clase pueden:

  • Ser almacenado en variables
  • Ser devuelto de una función.
  • Pasarse como argumentos a otra función.

High Order Function es una función que devuelve otra función.

Por ejemplo:

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}
techkuz
fuente
0

Las funciones de primera clase significan todo lo que puedes hacer con otros tipos (variables, booleanos, números ...), puedes hacerlo con funciones.

Por ejemplo, asígnelos a variables, páselo, créelos sobre la marcha.

Ishan Patel
fuente