Haskell: pourquoi la convention au nom d'une aide de la fonction “go”?
Je vois go
beaucoup lors de la lecture de Haskell matériel ou de la source, mais je n'ai jamais été vraiment à l'aise à ce sujet - (j'imagine que c'est la connotation négative de "goto" dans mon esprit). J'ai commencé à apprendre Haskell avec LYAH, et c'est là que j'ai ramassé dans la tendance à utiliser acc
et step
lors de l'écriture de plis. D'où vient la convention pour l'écriture go
viennent de?
Plus important encore, quel est exactement le nom de go
censé implique?
- J'ai l'habitude de l'appeler ma fonction
loop
à la place. - Jamais vu
go
dans toute Haskell matériel que j'ai lu. Pouvez-vous donner un exemple/de référence? - Par exemple, le Yesod livre de l'explication de l'agent Recenseur paquet. (Pourquoi le Yessod livre consacre donc beaucoup de matériel pour le sujet je ne sais pas, mais c'est à côté de la question)
- Pour ce que ça vaut, j'ai vu beaucoup de programmeurs C/C++ qui a aussi le nom de leurs fonctions d'assistance "aller" quand ils ne peuvent pas penser à un meilleur nom.
- FWIW, explicite la queue de la récursivité est la version fonctionnelle de goto dans beaucoup de façons, y compris la possibilité d'obscurcissement. Le typage statique et de règles de portée aider à garder la confusion à un minimum, si. Et comme pour le choix du nom, j'aime @Michael Snoyman la réponse ci-dessous au sujet de la durée et de la pertinence. Aussi, quand il y a juste une fonction d'assistance de son nom semble largement hors de propos, donc en général j'ai juste ramasser "aller à" ou "en boucle", car j'ai pour ramasser quelque chose et ces deux sens. J'ai tendance à préférer " go " pour les paresseux et les boucles "en boucle" des ceux de.
Vous devez vous connecter pour publier un commentaire.
Hmm! Certains l'archéologie!
Depuis 2004, j'ai utilisé
go
comme le nom générique de la queue-récursive travailleur boucles, dans le cas d'un travailleur/wrapper transformation d'une fonction récursive. J'ai commencé à l'utiliser largement dansbytestring
, par exempleétait de
bytestring
en août 2005.C'est écrit dans RWH, et a probablement été popularisée à partir de là. Aussi, dans le flux de fusion bibliothèque, Duncan Coutts et j'ai commencé à faire beaucoup.
Du GHC sources
L'idiome remonte plus loin cependant.
foldr
dans GHC.La Base de est donnée sous la forme:qui est probablement là où j'ai pris le truc (je pensais que c'était de Andy Gill de la thèse, mais ne peut pas trouver toute utilisation de
go
là). Il n'est pas donné dans cette forme, en bonne à tout faire, donc je pense que c'est d'abord apparu dans le GHC base de code.En 2001, Simon Marlow a l'aide de
go
dans certains des systèmes de code de niveau, de sorte que nous pourrions placer le blâme quelque part dans GHC, et cette idée nous conduit à le GHC source, oùgo
est largement utilisé dans les travailleur fonctions:GHC 3.02 et Glasgow
Déterrer de vieilles versions de GHC, nous voyons que dans GHC 0.29 cet idiome n'apparaît pas, mais par GHC 3.02 de la série (1998), la
go
idiome s'affiche partout. Un exemple, dansNumeric.lhs
, dans la définition deshowInt
, daté de 1996-1997:c'est une mise en œuvre différente de celle donné dans le rapport H98. Creuser dans la mise en œuvre de "Numérique.lhs", cependant, nous trouvons que ce n'est pas la même que la version qui a été ajouté à GHC 2,06 en 1997, et un très intéressant patch de Sigbjorne Finne apparaît, en avril 1998, ajouter
aller
de la boucle Numérique.de gauche.Ce dit que, au moins, en 1998, Sigbjorne a été l'ajout d'
go
boucles pour le GHC "std" de la bibliothèque, tandis que, simultanément, de nombreux les modules dans le GHC compilateur de base avaitgo
boucles. En creusant un peu, ce très intéressant s'engager dans Partain, en juillet 1996, ajoute un "go" en boucle dans GHC -- le code provient de Simon PJ si!Donc je vais l'appeler ce que un Glasgow idiome inventé par des gens à Glasgow qui a travaillé sur le GHC dans le milieu des années 90, tels que Simon Marlow, Sigbjorn Finne, Va Partain et Simon Peyton Jones.
f
, personnellement, j'utilise habituellementf'
comme nom pour ce genre de chose, mais à l'aide dego
comme une sorte de quasi-mot-clé idiome est quelque chose que je pourrais essayer de ramasser. Intéressant de noter queshowInt
utilise le langage pour éviter de les évaluer de la même garde à plusieurs reprises.goto
, et à la remise de la commande à une fonction d'assistance.loop
sauf si je suis modifiant le code qui utilise déjà lego
convention. J'ai toujours pensé qu'il était destiné signifie littéralement "aller", comme dans "aller autour de la boucle".Là, évidemment, N'réponse est la bonne. Permettez-moi seulement d'ajouter un petit détail (puisque ça semble être mon écriture que vous êtes directement référence à): allez, c'est agréable car il est à seulement deux lettres.
Oh, et en raison de la Yesod livre consacre autant de contenu à l'agent recenseur paquet est parce que je l'avais déjà écrit trois partie tutoriel énumérateur comme un billet de blog de la série, donc j'ai décidé de mai ainsi que l'inclure dans le livre. L'agent recenseur package est utilisé dans un certain nombre d'endroits tout au long de Yesod, de sorte qu'il est pertinent.
Je m'attends à ce langage pour être applicable non seulement aux structures linéaires (et donc des "boucles"), mais aussi à la ramification (arbre) des structures.
Je me demande combien de fois le
go
modèle correspond à l'accumulation de paramètres et, plus généralement, avec la poursuite de codage strategites que Mitch Baguette explorées dans l'étude Poursuite Programme en Fonction des Stratégies de Transformation (un de mes préféré de tous les temps les papiers).Dans ces cas, la
go
fonction a un sens particulier, qui peut ensuite être utilisé pour dériver un code efficace, à partir d'un élégant spécification.add_x
ouconsOnto_xs
.