Ich habe diesen einfachen Code, der eine Zeichenfolge liest und auf unbestimmte Zeit ausgibt.
%Vor% Nun möchte ich nach dem getLine
-Aufruf beenden, wenn die Zeile entweder "quit" oder "exit" ist.
Mein Versuch:
%Vor%Sieht für mich nicht idiomatisch aus. Gibt es einen besseren Weg?
Control.Monad.unless
(und es ist etwas beliebter Cousin, when
) abstrahieren Sie dieses Muster aus Ihrem Code:
Eine bedingte return ()
gefolgt von unconditional Code wird nicht den Trick machen, da return
nur eine Funktion ist, kein Flow-Control-Schlüsselwort wie in den meisten anderen Sprachen.
Wir können eine Hilfsfunktion erstellen, die eine bestimmte Aktion wiederholt, während sie den Wert zurückgibt:
%Vor% Sobald k
mzero
zurückgibt, stoppt die Schleife. Dann können wir es schön verwenden, um die Schleife an jeder Stelle mit dem Standard MonadPlus
combinators zu unterbrechen:
Oder in einer Zeile:
%Vor% Update: Vielleicht die einfachste Lösung ist whileJust_
von monad-loops :
Tags und Links haskell