Kürzerer Weg zu "return ()" in einer Monadenkette (, =) in Haskell?

8

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?

    
Dogbert 17.08.2013, 16:06
quelle

5 Antworten

16

Control.Monad.unless (und es ist etwas beliebter Cousin, when ) abstrahieren Sie dieses Muster aus Ihrem Code:

%Vor%

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.

    
delnan 17.08.2013, 16:18
quelle
9

Verwenden von pipes-4.0 :

%Vor%     
Gabriel Gonzalez 17.08.2013 18:10
quelle
4

Es scheint, dass Sie wegen der Verwendung von if / else und der do-Notation besorgt über das sequentielle Gefühl des Codes sind. Sie können versuchen, etwas wie:

%Vor%     
Ankur 17.08.2013 16:22
quelle
3

Ein Versuch, modisch zu sein:

%Vor%     
n.m. 17.08.2013 16:50
quelle
2

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:

%Vor%

Oder in einer Zeile:

%Vor%

Update: Vielleicht die einfachste Lösung ist whileJust_ von monad-loops :

%Vor%     
Petr Pudlák 17.08.2013 18:42
quelle

Tags und Links