Ich möchte in Haskell etwas machen, das so aussieht:
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
Offensichtlich ist dies nicht legal, da es keine gibt else
. Eine Alternative, an die ich gedacht habe:
nop :: IO ()
nop = sequence_ []
main2 = do s <- getLine
if s == "foo" then putStr "You entered foo" else nop
Dies ist ein wenig ausführlich, aber ich würde mich bei Bedarf damit zufrieden geben. Ich wäre überrascht, wenn es keine integrierte Version von gäbe nop
.
Alternative:
doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop
main3 = do s <- getLine
doIf (s == "foo") (putStr "You entered foo")
Dies ist prägnanter, aber die Syntax ist nicht besonders gut. Auch hier wäre ich nicht überrascht, etwas Eingebautes zu finden, das bereits vorhanden ist.
Was ist der bevorzugte Weg, um dies zu tun?
return
Haskell kein Sprachkonstrukt ist, sondern nur eine Funktion (mit einem schlecht gewählten Namen, wie bdonian sagt). Return hat keinen Einfluss auf den Kontrollfluss oder etwas, das Sie schreiben könnten:do {s <- getLine; return (); putStrLn s}
Das würde gut funktionieren .Not in scope: `when'
fürtest = do (when True (putStrLn "Hello"))
.when
erfordertimport Control.Monad
oben in der Datei.Sie können Hoogle verwenden , um Funktionen zu finden, in diesem Fall :
when
.In Hoogle können Sie die Typensignatur eingeben. Es wird versucht, übereinstimmende Funktionen in den Standardbibliotheken zu finden, indem die Typen vereinheitlicht und die Argumente neu angeordnet werden.
In Ihrem Fall können Sie einfach den Typ Ihrer
doIf
Funktion eingeben : Bool -> IO () -> IO () .when
ist die dritte Antwort hier, die Umkehrungunless
ist auch da.quelle