Convenção de nomenclatura para funções de ordem superior? [fechadas]

15

Existe uma convenção de nomenclatura para funções de ordem superior? Ou seja, funções que retornam outras funções.

Um exemplo em Javascript:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

Eu tenho a tendência de escrevê-lo da maneira acima: ou seja, otimizar a legibilidade no ponto de chamada (eu li as últimas linhas acima como "filtre a matriz para obter itens divisíveis apenas por 5"), no entanto, no ponto de definição do contexto em que é usada, não é tão fácil entender o que essa função faz com o nome.

nickf
fonte
4
Isso é surpreendente, eu sempre entendi o termo "função de ordem superior" como uma função que aceitou outra função como argumento. Não estou dizendo que você está errado, apenas acho interessante a diferença em nosso entendimento.
Racheet
6
As funções do @Racheet que retornam funções também são de ordem superior. Eles podem fazer as duas coisas.
itsbruce
3
@Racheet é um bom argumento e bastante relevante para este exemplo: o que o OP realmente está implementando é uma aplicação parcial. Muitos usos (todos? Não tenho certeza) em que as funções são retornadas podem ser vistos como um aplicativo parcial. @ Nickf: aqui está uma maneira mais limpa para implementar o seu exemplo

Respostas:

14

Não, acho que você não precisa de uma convenção de nomenclatura especial para indicar que está retornando uma função. Como podemos ver nos idiomas em que as funções são curry , retornar uma função é essencialmente o mesmo que ter uma função com vários argumentos. por exemplo, há pouca diferença entre onlyDivisibleBy(3)(6)eonlyDivisibleBy(3,6)

Eu mudaria o nome de onlyDivisibleBypara, isDivisibleBypois acho que isé uma maneira mais comum de indicar um predicado e onlyDivisibleBy(3)(6)parece estranho retornar, truepois 6 claramente também é divisível por 2

jk.
fonte
5

Nas linguagens funcionais fortemente tipadas, é óbvio pela assinatura da função o que é uma função de ordem superior e o que não é, portanto, simplesmente não há necessidade.

Em outros idiomas, nunca me deparei com uma convenção de nomes assim e não consigo pensar em uma que não seria apenas complicada. Melhor me concentrar nas funções de nomeação do que sobrecarregar os nomes assim, eu acho.

itsbruce
fonte
4

Não, e você não deve usar nenhum.

Por quê?

Porque isso seria um tipo de notação húngara . A idéia é exatamente que funções passadas para funções de ordem superior são apenas um tipo de variáveis. Então, trate-os assim.

Wilbert
fonte
1
A implicação é que a notação húngara deve ser evitada a todo custo? Eu recomendo a leitura Fazendo Errado errado Código Olhe
TehShrike
4
Eu li que antes, e eu ainda acredito notação húngara é ruim :)
Wilbert
@TehShrike Seu link está quebrado.
precisa saber é o seguinte
1
@ corvus_192 deve ter se perdido no redesenho do blog de Joel! Nova url parece ser joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike