Ich sehe go
viel, wenn ich Haskell-Material oder -Quelle lese, aber ich habe mich nie wirklich wohl gefühlt - (ich denke, es hat die negative Konnotation von "goto" in meinem Kopf). Ich habe angefangen, Haskell mit LYAH zu lernen, und dort habe ich die Tendenz zum Verwenden acc
und step
beim Schreiben von Falten aufgegriffen . Woher kommt die Konvention zum Schreiben go
?
Was genau soll der Name go
bedeuten?
haskell
naming-conventions
Dan Burton
quelle
quelle
loop
stattdessen meine Funktion auf .go
in einem Haskell-Material gesehen, das ich gelesen habe. Können Sie ein Beispiel / eine Referenz geben?Antworten:
Hmm! Etwas Archäologie!
Seit ungefähr 2004 verwende ich
go
als generischen Namen für schwanzrekursive Worker-Schleifen, wenn ich eine Worker / Wrapper-Transformation einer rekursiven Funktion durchführe. Ich habe angefangen, es weit verbreitet zu verwendenbytestring
, zwar von
bytestring
im August 2005.Dies wurde in RWH geschrieben und wahrscheinlich von dort populär gemacht. Außerdem haben Duncan Coutts und ich in der Stream-Fusion- Bibliothek viel damit begonnen.
Aus den GHC-Quellen
Die Redewendung geht jedoch weiter zurück.
foldr
in GHC.Base wird angegeben als:Hier habe ich wahrscheinlich den Trick aufgegriffen (ich hatte gedacht, dass dies aus Andy Gills These stammt, kann dort aber keine Verwendung
go
finden). Ist es nicht in dieser Form in Gofer angegeben, daher denke ich, dass dies zuerst in der GHC-Codebasis erschien.Bis 2001 verwendete Simon Marlow einen
go
Teil des Codes auf Systemebene, sodass wir die Schuld möglicherweise irgendwo in GHC platzieren. Dieser Hinweis führt uns zur GHC-Quelle ,go
die in Worker-Funktionen weit verbreitet ist:GHC 3.02 und Glasgow
Wenn wir alte Versionen von GHC ausgraben, sehen wir, dass in GHC 0.29 dieses Idiom nicht vorkommt, aber in der GHC 3.02-Serie (1998) erscheint das
go
Idiom überall. Ein BeispielNumeric.lhs
in der Definition vonshowInt
1996-1997:Dies ist eine andere Implementierung als die eine als im H98-Bericht angegeben . Wenn wir uns jedoch mit der Implementierung von "Numeric.lhs" befassen , stellen wir fest, dass es nicht mit der Version übereinstimmt, die 1997 zu GHC 2.06 hinzugefügt wurde, und im April 1998 erscheint ein sehr interessanter Patch von Sigbjorne Finne, der a hinzufügt
go
Schleife zu Numeric.lhs.Dies besagt, dass Sigbjorne zumindest 1998
go
Schleifen zur GHC "std" -Bibliothek hinzufügte , während gleichzeitig viele Module in dem GHC Compiler Kern hattengo
Schleifen. Dieses sehr interessante Commit von Will Partain im Juli 1996 fügt GHC eine "Go" -Schleife hinzu - der Code stammt jedoch von Simon PJ!Ich werde dies als eine Glasgow-Sprache bezeichnen , die von Leuten in Glasgow erfunden wurde, die Mitte der 90er Jahre an GHC gearbeitet haben, wie Simon Marlow , Sigbjorn Finne , Will Partain und Simon Peyton Jones .
quelle
f
ich normalerweise persönlichf'
als Namen für diese Art von Dingen verwenden, obwohlgo
ich versuchen könnte , sie als eine Art Keyword-Idiom zu verwenden. Interessant zu bemerken, dassshowInt
die Redewendung verwendet wird, um zu vermeiden, dass dieselbe Wache mehrmals bewertet wird.goto
, dass die Kontrolle an eine Hilfsfunktion übergeben wird.loop
sei denn, ich ändere Code, der bereits diego
Konvention verwendet. Ich dachte immer, es sollte wörtlich "gehen" bedeuten, wie in "um die Schleife gehen".Offensichtlich ist Dons Antwort die richtige. Lassen Sie mich nur ein kleines Detail hinzufügen (da es mein Schreiben zu sein scheint, auf das Sie sich direkt beziehen): go ist schön, weil es nur zwei Buchstaben sind.
Oh, und der Grund, warum das Yesod-Buch dem Enumerator-Paket so viel Inhalt widmet, ist, dass ich das dreiteilige Tutorial von Enumerator bereits als Blog-Post-Serie geschrieben habe und mich daher entschlossen habe, es auch in das Buch aufzunehmen. Das Enumerator-Paket wird an mehreren Stellen in Yesod verwendet, daher ist es relevant.
quelle
Ich würde erwarten, dass diese Redewendung nicht nur auf lineare Strukturen (und damit auf "Schleifen") anwendbar ist, sondern auch auf verzweigte (baumartige) Strukturen.
Ich frage mich, wie oft das
go
Muster Akkumulationsparametern und allgemeiner den Strategien zur Fortsetzung der Codierung entspricht, die Mitch Wand in der Arbeit Continuation-Based Program Transformation Strategies (eine meiner Lieblingsarbeiten aller Zeiten) untersucht hat. In diesen Fällen hat diego
Funktion eine bestimmte Bedeutung, die dann verwendet werden kann, um effizienten Code aus einer eleganten Spezifikation abzuleiten.quelle
add_x
oderconsOnto_xs
.