Ich möchte den Zustand des vorherigen if condition
überprüfen, um zu bestimmen, ob der nächste if condition
ausgeführt werden soll oder nicht. Jedes if condition
kann einen Wert zurückgeben.
Bearbeiten: Entschuldigung dafür, dass das Beispiel, das ich vorher vorgestellt habe, ein bisschen seltsam aussieht ... :(
Dies ist mein reales Beispiel, und ich möchte die if-then-else
für goingToMove
Bearbeiten: Schlechtes Beispiel Wenn dieses Ding in Java geschrieben ist, kann ich ein veränderbares boolesches Flag verwenden und veränderbare Daten zurückgeben.
%Vor% Aber in Haskell, gibt es keine veränderbaren Daten und nur if-then-else
condition. Dann sieht der Code so aus, und ich möchte das vereinfachen, weil es in meiner echten Arbeit 8 gibt Ebenen von if-then-else
, die schrecklich und unordentlich aussehen ....
In Java, wenn ich folgendes machen wollte:
%Vor% Was ich im Wesentlichen mache, ist das erste Ergebnis von func1(args)
, func2(args)
, func3(args)
, func4(args)
, das nicht null zurückgibt.
In Haskell würde ich func1
, func2
, func3
und func4
als Funktionen modellieren, die einen Maybe a
-Wert zurückgegeben haben, so dass sie Nothing
zurückgeben könnten, wenn sie fehlgeschlagen sind.
Dann kann ich den Operator <|>
verwenden (aus Control.Applicative
), der die folgende Definition für Maybe a
hat:
So kann ich das obige Java in
konvertieren %Vor% Und aufgrund des Wunders der Lazy-Evaluierung wird func2 arg
nur ausgewertet, wenn func1 arg
Nothing
zurückgibt, wie im Java-Beispiel.
Abgesehen von der netten Beschäftigung von <|>
, die rampion gab und den ähnlichen Vorschlag von sclv , ist ein anderer üblicher Weg, Wachen zu benutzen und Faulheit auszunutzen,
Aufgrund von Faulheit wird move i
( i = 3, 2, 1
) nur ausgewertet, wenn es benötigt wird.
In dem gegebenen Fall ist move 3 <|> move 2 <|> move 1
viel schöner, aber in Fällen, in denen die Bedingungen die Auswertung verschiedener Funktionen mit unterschiedlichen Rückgabetypen erfordern, kann die Verwendung von Wächtern und faulen Bindungen in einer where
-Klausel die natürliche Lösung sein peinlich geschachtelt if
s.
Sie möchten routes
, wenn seine Länge 2 ist, oder das erste Ergebnis ungleich null aus einer Reihe von Anwendungen von goingToMove
, die davon abhängen, welche Eckenfunktion auf p
angewendet wird.
Tags und Links haskell functional-programming recursion if-statement tail-recursion