Qualquer diferença entre a função de primeira classe e a função de alta ordem


Respostas:


154

Há uma diferença. Quando você diz que um idioma tem funções de primeira classe, significa que o idioma trata as funções como valores - que você pode atribuir uma função a uma variável, passá-la por aí etc. Funções de ordem superior são funções que funcionam em outras funções, significando que eles assumem uma ou mais funções como argumento e também podem retornar uma função.

O conceito de "ordem superior" pode ser aplicado a funções em geral, como funções no sentido matemático. O conceito de "primeira classe" tem apenas a ver com funções em linguagens de programação. É raramente usado quando se refere a uma função, como "uma função de primeira classe". É muito mais comum dizer que "uma linguagem tem / não suporta funções de primeira classe".

As duas coisas estão intimamente relacionadas, pois é difícil imaginar uma linguagem com funções de primeira classe que também não suportaria funções de ordem superior e, inversamente, uma linguagem com funções de ordem superior, mas sem o suporte de funções de primeira classe.


2
Eu acho que uma coisa me deixa facilmente confusa é que elas estão intimamente relacionadas.
Simon

63
@ Simon Acho que a chave para evitar confusão é lembrar que uma linguagem possui funções de primeira classe (você também pode falar sobre outras coisas de "primeira classe", como aulas de primeira classe, etc.), ou não. Portanto, você nunca fala sobre uma função específica ser de primeira classe ou não. OTOH, quando você diz que uma função é de ordem superior ou não, isso apenas indica se ela funciona ou não em funções; portanto, a "ordem superior" é uma propriedade de cada função individual. Portanto, "possui funções de primeira classe" é uma propriedade de uma linguagem e "é de ordem superior" é uma propriedade de uma função.
21412 Ben

Exatamente Ben. Eu estava pensando que esses dois são uma propriedade para a função, portanto, fiquei confuso. Obrigado pelos seus comentários.
19612 Simon

Além disso, é bom lembrar que "funções de primeira classe" NÃO são iguais ao suporte de fechamento. Por exemplo, em C suporta "funções de primeira classe" por meio de ponteiros de função. No entanto, C não suporta nenhuma noção de função aninhada e, portanto, não suporta fechamentos.
Tac-Tics

1
@ Tac-Tics as definições são certamente subjetivas e abertas ao debate, mas eu pessoalmente prefiro pensar que C suporta apenas funções de ordem superior (via ponteiros de função). No entanto, funções de primeira classe não são suportadas porque funções são inferiores a outros tipos de valor como intou char, no sentido de que não podem ser explicitamente definidas (por um corpo de função) onde você desejar.
Wlnirvana

67

As funções de primeira classe são tratadas como um objeto (ou atribuíveis a uma variável).

Funções de ordem superior são funções que usam pelo menos uma função de primeira classe como parâmetro ou retornam pelo menos uma função de primeira classe.


20

Eles são diferentes.

Funções de primeira classe

Os valores em um idioma tratado de maneira uniforme são chamados de "primeira classe". Eles podem ser armazenados em estruturas de dados, passados ​​como argumentos ou usados ​​em estruturas de controle.

Pode-se dizer que idiomas que suportam valores com tipos de função e os tratam da mesma forma que valores sem função, têm "funções de primeira classe".

Funções de ordem superior

Uma das conseqüências de ter funções de primeira classe é que você deve poder passar uma função como argumento para outra função. A última função agora é de "ordem superior". É uma função que assume uma função como argumento.

O exemplo canônico é "mapa"

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

Ou seja, ele pega uma função e uma matriz e retorna uma nova matriz com a função aplicada a cada elemento.

Idiomas funcionais - idiomas em que as funções são o principal meio de criação de programas - todos têm funções de primeira classe. A maioria também possui funções de ordem superior (exceções muito raras são linguagens como o Excel, que podem ser consideradas funcionais, mas não de ordem superior).


1
Obrigado Don. É abrangente. E acho que a fase "Uma das consequências" indica um tipo de relacionamento entre os dois.
21712 Simon

10

Além das respostas anteriores, observe que um idioma com funções de primeira classe habilita automaticamente a expressão de funções de ordem superior (porque você pode passar funções como parâmetros como qualquer outro valor).

Por outro lado, você pode imaginar linguagens que suportam funções de ordem superior, mas não tornam as funções de primeira classe (e onde os parâmetros que são funções são tratados especialmente e diferentes dos parâmetros de valor "comuns").

Portanto, a presença de funções de primeira classe (como um recurso de linguagem) implica a presença de funções de ordem superior, mas não o contrário.


Você pode dar um exemplo em que uma função de ordem superior não é uma função de primeira classe. (Eu pensei que ambos são iguais.)
Ather

@ATHER, não tenho um exemplo concreto de uma linguagem que faça essa escolha de design para funções como tais. Mas algo semelhante é o caso, por exemplo, com modelos em C ++: modelos são de ordem superior (você pode ter "parâmetros de modelo de modelo"), mas não valores de primeira classe, ou seja, modelos não podem ser parâmetros para funções comuns. Da mesma forma com, por exemplo, módulos / functores em ML.
Andreas Rossberg

@AndreasRossberg O Java 8 não seria uma resposta válida para sua pergunta? As funções não são cidadãos de primeira classe, mas os métodos Java podem receber funções (por meio de interfaces funcionais), conforme descrito por você como "parâmetros que são funções são tratadas especialmente e diferentes dos parâmetros de valor" comuns "".
Abdul

1

As funções de primeira classe podem:

  • Ser armazenado em variáveis
  • Ser retornado de uma função.
  • Ser passado como argumentos para outra função.

Função de alta ordem é uma função que retorna outra função.

Por exemplo:

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

0

Funções de primeira classe significam tudo que você pode fazer com outros tipos (variáveis, booleanos, números ...), você pode fazê-lo com funções.

Por exemplo, atribua-os a variáveis, repasse-os e crie-os rapidamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.