Endlosschleife in der funktionalen Programmierung?

8
  • Ich habe mich gefragt: Können bei der funktionalen Programmierung Endlosschleifen gemacht werden?

Beispiel: Wenn Windows-API verwendet wird, um Windows-Nachrichten zu erhalten, wird es normalerweise in einer Schleife implementiert.

Ich weiß, dass es möglich ist, eine Funktion zu erstellen, die endlos in Rekursion geht. Ich erwarte, dass dies zu einem Stapelüberlauf führen wird.

  • sind Endlosschleife die falsche Einstellung für die funktionale Programmierung?

  • ist die Schnittstelle des Betriebssystems oder der Hardware das Problem?

es scheint mir nicht wie ein funktionales Programm / o.s. könnte von selbst weiterlaufen

Ich habe ein bisschen Erfahrung beim Schreiben funktionaler Programme, aber das hat mich immer gestört. Bitte teilen Sie Ihre Gedanken / Einblicke zu diesen Themen

    
symbiont 14.08.2010, 15:03
quelle

4 Antworten

4

Wie andere bereits geschrieben haben, ist durch Endrekursionen möglich. p>

z. loop() wird effektiv als Endlosschleife (im konstanten Stack-Bereich) ausgeführt, da der Compiler den tail-rekursiven Aufruf von loop am Ende optimieren kann.

%Vor%

Aber

  

sind Endlosschleife die falsche Einstellung für die funktionale Programmierung?

hat noch einen Punkt. Betrachten Sie Ihr Windows-API-Beispiel mit der Endlosschleife. Das ist alles andere als funktional. Denken Sie daran - Funktion bedeutet, in Werten zu denken (und was sie bedeuten). Daher würde man eher einen reaktiven / ereignisbasierten Ansatz wie den [Pseudo-Funktionscode]

wählen %Vor%

Also

  

es scheint mir nicht wie ein funktionales Programm / o.s. könnte von selbst weiterlaufen

ist technisch falsch - Sie können Endlosschleifen implementieren - aber es gibt oft keinen (funktionalen) Punkt dabei. Warum sollte man das brauchen, außer für eine Art von IO-Polling? Werte rein funktional zu transformieren sollte sich als sinnvoll erweisen.

    
Dario 14.08.2010, 15:20
quelle
5

Wenn Sie die Tail-Rekursion verwenden, haben Sie effektiv eine Iteration, wie eine for / while-Schleife. Daher denke ich, dass Sie eine Endlosschleife haben können, ohne einen Stapelüberlauf zu bekommen.

Auf Ihre Frage: "sind Endlosschleifen die falsche Einstellung für die funktionale Programmierung?" - While- oder Tail-Rekursion in F #, was wann zu verwenden ist ?

    
JohnB 14.08.2010 15:07
quelle
1

Sie können unendliche Tail Recursion haben, wenn Ihr Compiler sie erkennt. Einige Sprachen, z.B. scheme, verlangen, dass Compiler Tail-Rekursion erkennen und keinen Stack-Platz dafür vergeben.

Bearbeiten Ich möchte den anderen Antworten nicht widersprechen, aber "unendliche" tail-rekursive Schleifen sind ein gebräuchliches Idiom für den Umgang mit der Außenwelt. Das folgende Beispiel stammt aus Real World Haskell und ist repräsentativ für das Idiom.

%Vor%

Wir betrachten die Außenwelt im Wesentlichen als einen Stream .

    
deinst 14.08.2010 15:07
quelle
0

Die meisten, wenn nicht alle Verwendungen von "Endlosschleifen" in der funktionalen Programmierung können durch Co-Rekursion modelliert werden. Andere Antworten haben bisher auf allgemeine Rekursion hingewiesen, aber die uneingeschränkte Verwendung von Rekursion ist wohl ein schlechter Ansatz, da er zu schlecht strukturiertem Code führen kann.

Die große Mehrheit des Codes in einem rein funktionalen Programm sollte in die gesamte Teilmenge geschrieben werden, d. h. Muster wie strukturelle Rekursion oder Co-Rekursion verwenden (die die Beendigung und den Fortschritt sicherstellen), anstatt auf die allgemeine Rekursion zurückzugehen. Hoffentlich werden zukünftige Versionen von GHC direkte Unterstützung für das Aufspüren einer vollständigen Teilmenge von Haskell und das Ausgeben von Warnungen für Code enthalten, für die nicht nachgewiesen werden kann, dass sie beendet oder fortschreitet.

    
func 16.08.2010 04:29
quelle