Question

Je me moquais de la programmation fonctionnelle lorsque je me suis rendu compte de la nécessité de cette fonction, mais je ne sais pas comment on appelle ce genre de chose dans la nomenclature standard. Quelqu'un le reconnaît?

function WhatAmIDoing(args...)
   return function()
       return args
   end
end

Modifier: a généralisé la fonction. Elle prend une quantité variable d'arguments (ou peut-être une liste implicite) et renvoie une fonction qui, lorsqu'elle est appelée, renvoie tous les arguments, comme un curry ou un cornichon, mais cela ne semble pas être non plus.

Était-ce utile?

La solution

WhatAmIDoing est une fonction d'ordre supérieur car il s'agit d'une fonction qui renvoie une autre fonction.

Il renvoie un thunk & # 8212; une fermeture créée pour le calcul différé de la valeur réelle. Les thunks sont généralement créés pour évaluer paresseusement une expression (et éventuellement la mémoriser), mais dans d'autres cas, une fonction est simplement nécessaire à la place d'une valeur nue, comme dans le cas de " constamment 5 ". ;, qui dans certaines langues renvoie une fonction qui renvoie toujours 5.

Ceci pourrait s’appliquer dans l’exemple donné, car si le langage s’évalue dans un ordre applicatif (c’est-à-dire évalue les arguments avant d’appeler une fonction), la fonction ne sert qu’à transformer les valeurs en une fonction qui les retourne.

WhatAmIDoing est en réalité une implémentation du "constamment" fonction que je décrivais. Mais en général, vous n'avez pas à renvoyer uniquement args dans la fonction interne. Vous pouvez renvoyer " ackermann (args) ", ce qui peut prendre un certain temps, comme dans ...

function WhatAmIDoing2(args...)
   return function()
       return ackermann(args)
   end
end

Mais WhatAmIDoing2 reviendrait immédiatement car l'évaluation de la fonction ackermann serait suspendue dans un clôture . (Oui, même dans une langue d’appel par valeur.)

Autres conseils

En programmation fonctionnelle, une fonction qui prend une autre fonction en argument ou retourne une autre fonction est appelée supérieur- fonction de commande .

Je dirais que XXXX renvoie une fermeture de la fonction non nommée liée aux valeurs de x, y et z.

Cet article wikipedia peut faire la lumière

Currying concerne la transformation d'une fonction en une chaîne de fonctions, chacune ne prenant qu'un paramètre. et en retournant une autre fonction de ce type. Donc, cet exemple n’a aucune relation avec le currying.

Pickling est un terme utilisé habituellement pour désigner une sorte de sérialisation. Peut-être pour stocker un objet construit à partir de plusieurs valeurs.

Si l’aspect intéressant pour vous est que la fonction retournée puisse accéder aux arguments de la fonction XXXX, je choisirais alors Remo.D.

Comme d'autres l'ont déjà dit, il s'agit d'une fonction d'ordre supérieur . Comme vous avez " motif " dans votre question, je pensais ajouter que cette fonctionnalité des langages fonctionnels est souvent modélisée à l'aide du modèle de stratégie dans des langues sans fonctions d'ordre supérieur.

Quelque chose de très similaire s'appelle constamment dans Clojure:

/richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

Seule la fonction constamment renvoie une quantité d'arguments arbitraire, ce qui la rend plus générale (et flexible) que votre modèle.

Je ne sais pas si ce modèle a un nom, mais je l'utiliserais dans les cas où des fonctions normales sont attendues, mais tout ce qui m'importe, c'est qu'une certaine valeur soit renvoyée:

(map (constantly 9) [1 2 3])
=> (9 9 9) 

Je me demandais simplement pourquoi vous utilisiez cela.

Un délégué?

En gros, vous retournez une fonction? ou la sortie d'une fonction?

Je n'ai pas compris, désolé ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top