2012-04-13 20 views

Respuesta

103

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 con 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 funciones en general, como funciones en el sentido matemático. El concepto de "primera clase" solo tiene que ver con funciones en lenguajes de programación. Rara vez se usa para referirse 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 para 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 admitan funciones de orden superior y, a la inversa, un lenguaje con funciones de orden superior pero sin soporte de funciones de primera clase.

+2

Creo que una cosa que me confunde fácilmente es que están estrechamente relacionados. – Simon

+33

@Simon Creo que la clave para evitar confusiones es recordar que un idioma tiene funciones de primera clase (también se puede hablar de otras cosas de primera clase, como clases de primera clase, etc.), o no . Entonces nunca se habla de ** una función particular ** siendo de primera clase o no. OTOH, cuando dices que una función es de orden superior o no, solo dice si opera o no en funciones, por lo que "orden superior" es una propiedad de cada función individual. Por lo tanto, "tiene funciones de primera clase" es una propiedad de un idioma, y ​​"es de orden superior" es una propiedad de una función. – Ben

+0

Exactamente Ben. Estaba pensando que esos dos son propiedad de la función, por lo tanto, estaba confundido. Gracias tus comentarios – Simon

37

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 al menos una función de primera clase como parámetro.

16

Son diferentes.

funciones de primera clase

valores en un lenguaje que se manejan de manera uniforme a lo largo son llamados "de primera clase". Se pueden almacenar en estructuras de datos, pasar como argumentos o usarse en estructuras de control.

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

funciones de orden superior

Una de las consecuencias de tener funciones de primera clase es que usted debería ser capaz de pasar una función como argumento a otra función. La última función ahora es "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 

Esto es, se necesita una función, y una matriz, y devuelve una nueva matriz con la función aplicada a cada elemento.

Idiomas funcionales: idiomas en los que las funciones son el principal medio para crear programas: todos tienen funciones de primera clase. La mayoría también tienen funciones de orden superior (excepciones muy raras son idiomas como Excel, que puede decirse que es funcional, pero no de orden superior).

+1

Gracias Don. Es completo Y creo que la fase "Una de las consecuencias" indica un tipo de relación entre esos dos. – Simon

9

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 idiomas que admiten funciones de orden superior, pero no hacen que las funciones sean de primera clase (y donde los parámetros son funciones especialmente tratadas y diferentes de los parámetros de valor "ordinarios").

De modo que la presencia de funciones de primera clase (como función de idioma) implica la presencia de funciones de orden superior, pero no al revés.

+0

Puede dar un ejemplo donde una función de orden superior no es una función de primera clase. (Pensé que los dos son iguales.) – ATHER

+0

@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, p. con plantillas en C++: las plantillas son de orden superior (puede tener "parámetros de plantilla de plantilla"), pero no los valores de primera clase, es decir, las plantillas no pueden ser parámetros de las funciones normales. Del mismo modo, por ejemplo, módulos/funtores en ML. –

+0

@AndreasRossberg ¿No sería Java 8 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), tal como lo describe usted como "parámetros que son funciones tratadas especialmente y diferentes de parámetros de valor" ordinarios ". – Abdul

0

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

Por ejemplo, asignarles variables, pasarlas, crearlas al vuelo.