В функции более высокого порядка сложите / уменьшите, как называется функциональный аргумент, если он есть?
Я работаю над библиотекой монадической табличной обработки, где строки складываются, чтобы произвести простой анализ (например, найти минимум, максимум, среднее для столбца). Поэтому я ищу надежное имя для аргумента fold
функции, и любое имя, хорошо известное в сообществе ML (или Haskell или Common Lisp в качестве второго и третьего кандидатов), было бы интересно.
Подобное имя f
часто встречается в описании fold
функций, однако оно не является описательным , и существительное подойдет лучше.
terminology
functional-programming
naming
user40989
источник
источник
fold
является функцией более высокого порядка. Аргумент «сбросить» - это просто аргументОтветы:
Я не знаю, есть ли один ответ на это, как упоминал @jozefg. И так чисто из предположений, вот одно из возможных объяснений:
Я подозреваю, что причина в том, что тип - например,
(a -> b -> b)
в Haskellfoldr
- более значим, чем любое имя, которое можно придумать. Поскольку параметрыa
иb
типа могут быть любыми , функция может делать практически все что угодно. Таким образом , вы остались с такими именами , какfunction
,combiner
,morphism
иargument
, которые не являются особенно значимыми либо. Можно также использовать короткое, не отвлекающее имя.Другой пример -
id :: a -> a
функция: как назвать ее аргумент? Опять же, я думаю, чтоid
тип является более описательным, чем его имя аргумента.Тем не менее, я согласен с вами - кажется, должно быть общее имя, возможно, в математике. Я надеюсь, что кто-то может исправить меня в этом.
Некоторые примеры его названия в реальном коде:
В библиотеках Haskell это в основном называется
f
(и иногдаoperator
в комментариях):Это также называется
f
в Clojure :источник
Я не согласен с идеей, что
f
это плохое имя для аргумента функцииfold
. Причина, по которой нам нужны описательные имена в программировании, заключается в том, что мы знаем, что описывает это имя, и имяf
обычно используется в математике (и функциональных языках программирования) для функции (как естьg
иh
).Мы почти ничего не знаем
f
(по замыслу, так как, если бы мы могли быть более конкретными по этому поводу, мы не могли бы использоватьfold
столько же вещей), и имяf
говорит нам обо всем, что нам нужно знать, за исключением того, что оно является функцией двух аргументов. Названиеf
очень похоже на местоимение «it» в английском языке - это заполнитель, который может означать почти все. Мы не знаем, что это такое, пока не используем его в предложении, и мы не знаем, чтоf
это, пока не позвонимfold
.При именовании вещей мы хотим получить как можно больше информации из имени и предпочитаем, чтобы имя было коротким (если мы можем получить это, не жертвуя важной информацией). Здесь у нас есть очень короткое имя, которое говорит нам почти все, что мы знаем об этом. Я не думаю, что это может быть улучшено.
В императивном программировании
i
используется как счетчик циклов (как естьj
иk
, если нам нужно больше); в функциональном программировании,f
используется для аргумента функции в функциях высшего порядка (как естьg
иh
, если нам нужно больше). У меня нет достаточного опыта работы с функциональными языками, чтобы быть уверенным, что соглашение f / g / h так же хорошо, как и соглашение i / j / k, но если это не так, я думаю, что это должно быть (это определенно установлено в математике).источник
Самым распространенным названием для этого, которое я слышал, кроме местоимения,
f
было быbinary operation
илиbinary function
- проблема с более точным указанием того, что он может делать буквально все что угодно , и именно поэтому люди придерживаются сигнатуры типаa -> b -> a
(или,a -> b -> b
если она правильная, складывается) ,Поэтому я предлагаю вам сделать именно это, придерживаясь сигнатуры типа, к счастью, у сигнатуры конкретного типа есть имя:
binary function
точно так же, какa -> a
и aunary operation
, иa -> b
aunary function
, вы можете вызыватьa -> a -> a
abinary operation
иa -> b -> c
abinary function
.источник
binary operation
бы больше , среднийa -> a -> a
иbinary function
будет стоять заa -> b -> c
... правду , несомненно , лежит между ними. :-)Запрашиваемую вами функцию иногда называют «объединяющей функцией» (см., Например, страницу HaskellWiki в Fold ), но это не достаточно распространено, чтобы называть ее стандартной терминологией.
источник