Dans la fonction d'ordre supérieur, repliez / réduisez quel est le nom, le cas échéant, de l'argument fonctionnel?
Je travaille sur une bibliothèque de traitement tabulaire monadique où les lignes sont pliées pour produire des analyses simples (comme trouver le minimum, le maximum, la moyenne d'une colonne). Je recherche donc un nom solide pour l'argument de la fold
fonction et tout nom bien établi dans la communauté ML (ou Haskell ou Common Lisp comme deuxième et troisième candidats) serait intéressant.
Un nom comme f
est commun dans la description des fold
fonctions, il n'est cependant pas descriptif et un nom serait mieux adapté.
terminology
functional-programming
naming
user40989
la source
la source
fold
est une fonction d'ordre supérieur. L'argument de se coucher est juste un ça, un argumentRéponses:
Je ne sais pas s'il y a une seule réponse à cela, comme l'a mentionné @jozefg. Et si purement par spéculation, voici une explication possible:
Je soupçonne que la raison en est que le type -
(a -> b -> b)
dans Haskellfoldr
, par exemple - est plus significatif que n'importe quel nom que l'on pourrait trouver. Étant donné que les paramètresa
etb
type peuvent être n'importe quoi , la fonction peut également faire à peu près n'importe quoi. Donc , vous vous retrouvez avec des noms commefunction
,combiner
,morphism
etargument
qui ne sont pas particulièrement significatifs non plus . Autant utiliser un nom court et non distrayant.Un autre exemple est la
id :: a -> a
fonction: comment appeler son argument? Encore une fois, je pense queid
le type de est plus descriptif que son nom d'argument.Cependant, je suis d'accord avec vous - il semble qu'il devrait y avoir un nom commun, peut-être en mathématiques. J'espère que quelqu'un pourra me corriger à ce sujet.
Quelques exemples de son nom en vrai code:
Dans les bibliothèques de Haskell , il est principalement appelé
f
(et parfoisoperator
dans les commentaires):On l'appelle aussi
f
dans Clojure :la source
Je ne suis pas d'accord avec l'idée que
f
c'est un mauvais nom pour l'argument de fonction defold
. La raison pour laquelle nous voulons des noms descriptifs dans la programmation est que nous savons ce que le nom décrit, et le nomf
est couramment utilisé en mathématiques (et langages de programmation fonctionnels) pour une fonction (comme le sontg
eth
).Nous ne savons presque rien
f
(par conception, car si nous pouvions être plus précis à ce sujet, nous ne pourrions pas utiliserfold
autant de choses), et le nomf
nous dit tout ce que nous devons savoir, sauf qu'il est fonction de deux arguments. Le nomf
ressemble beaucoup au pronom «it» en anglais - c'est un espace réservé qui pourrait signifier presque n'importe quoi. Nous ne savons pas ce que c'est jusqu'à ce que nous l'utilisions dans une phrase, et nous ne savons pas ce quef
c'est jusqu'à ce que nous appelionsfold
.Lorsque nous nommons des choses, nous voulons obtenir autant d'informations que possible du nom, et nous préférons que le nom soit court (si nous pouvons l'obtenir sans sacrifier des informations importantes). Ici, nous avons un nom très court qui nous dit presque tout ce que nous savons à ce sujet. Je ne pense pas que cela puisse être amélioré.
En programmation impérative,
i
est utilisé comme compteur de boucles (comme le sontj
etk
, si nous en avons besoin de plus); en programmation fonctionnelle,f
est utilisé pour un argument de fonction dans les fonctions d'ordre supérieur (comme le sontg
eth
, si nous en avons besoin de plus). Je n'ai pas assez d'expérience avec les langages fonctionnels pour être sûr que la convention f / g / h est aussi bien établie que la convention i / j / k, mais si ce n'est pas le cas, je pense que ça devrait l'être (c'est certainement établie en mathématiques).la source
Le nom le plus courant pour cela que j'ai entendu autre que le pronom
f
seraitbinary operation
oubinary function
- le problème d'être plus précis que cela est qu'il pourrait faire n'importe quoi , et c'est pourquoi les gens s'en tiennent à la signature de typea -> b -> a
(oua -> b -> b
si c'est le bon pli) .Je vous propose donc de faire exactement cela, de vous en tenir à la signature de type, heureusement, cette signature de type spécifique a un nom:,
binary function
tout commea -> a
est ununary operation
, eta -> b
est ununary function
, vous pouvez appelera -> a -> a
unbinary operation
eta -> b -> c
unbinary function
.la source
binary operation
cela signifierait plusa -> a -> a
etbinary function
représenteraita -> b -> c
… la vérité se situe sûrement entre les deux. :-)La fonction que vous demandez est parfois appelée «fonction de combinaison» (voir par exemple la page HaskellWiki sur Fold ), mais ce n'est pas suffisamment courant pour l'appeler terminologie standard.
la source