Соглашение об именах для функций высшего порядка? [закрыто]

15

Существует ли соглашение об именах для функций более высокого порядка? То есть функции, которые возвращают другие функции.

Пример в 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]

Я обычно писал так, как указано выше: то есть оптимизировал разборчивость в точке вызова (последние строки выше я читал как «фильтровать массив, чтобы получить элементы, кратные только 5»), однако в точке определения далеко из контекста, в котором она используется, не так просто понять, что делает эта функция по ее названию.

nickf
источник
4
Это удивительно, я всегда понимал термин «функция более высокого порядка», чтобы обозначать функцию, которая приняла другую функцию в качестве аргумента. Я не говорю, что вы не правы, я просто нахожу разницу в нашем понимании.
Рашит
6
Функции @Racheet, которые возвращают функции также более высокого порядка. Они могут сделать оба.
Брюс
3
@Racheet - это хорошая точка зрения, которая имеет отношение к этому примеру: на самом деле OP реализует частичное применение. Многие (все? Не уверенны) случаи использования возвращаемых функций можно рассматривать как частичное применение. @ nickf: вот более чистый способ реализации вашего примера

Ответы:

14

Нет, я не думаю, что вам нужно специальное соглашение об именах, чтобы указать, что вы возвращаете функцию. Как мы видим из языков, в которых функции каррируются , возвращение функции по сути аналогично наличию функции с несколькими аргументами. например, есть небольшая разница между onlyDivisibleBy(3)(6)иonlyDivisibleBy(3,6)

Я бы поменял имя с onlyDivisibleByна isDivisibleByхотя, так как я думаю, что isэто более распространенный способ указать предикат и onlyDivisibleBy(3)(6)кажется странным возвращать, trueучитывая, что 6, очевидно, также делится на 2

JK.
источник
5

В строго типизированных функциональных языках из сигнатуры функции очевидно, что является функцией более высокого порядка, а что нет, поэтому в этом просто нет необходимости.

На других языках я никогда не сталкивался с таким соглашением об именах, и я не могу думать о таком, который не был бы просто громоздким. Я думаю, что лучше сконцентрироваться на функциях именования, чем перегружать такие имена.

itsbruce
источник
4

Нет, и вы не должны использовать любой.

Почему?

Потому что это будет своего рода венгерская нотация . Идея состоит именно в том, что функции, передаваемые в функции более высокого порядка, являются просто разновидностью переменных. Так относись к ним так.

Уилберт
источник
1
Подразумевается, что венгерской нотации следует избегать любой ценой? Я бы порекомендовал прочитать «Неправильный код выглядит неправильно»
TehShrike,
4
Я читал это раньше, и я все еще считаю, что венгерская запись плоха :)
Уилберт
@TehShrike Ваша ссылка не работает.
corvus_192
1
@ corvus_192 должно быть потеряно в редизайне блога Джоэла! Похоже, новый URL будет joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike