Quiero hacer algo en Haskell que se vea así:
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
Obviamente, esto no es legal ya que no existe else
. Una alternativa en la que he pensado:
nop :: IO ()
nop = sequence_ []
main2 = do s <- getLine
if s == "foo" then putStr "You entered foo" else nop
Esto es un poco detallado, pero me conformaría con ello si fuera necesario. Sin embargo, me sorprendería que no hubiera una versión incorporada de nop
.
Alternativamente:
doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop
main3 = do s <- getLine
doIf (s == "foo") (putStr "You entered foo")
Esto es más conciso, pero la sintaxis no es particularmente agradable. Una vez más, no me sorprendería encontrar algo integrado que ya exista.
¿Cuál es la forma preferida de hacer esto?
return
en Haskell no es una construcción de lenguaje, es solo una función (con un nombre mal elegido, como dice bdonian). El retorno no afecta el flujo de control, o algo, podría escribir:do {s <- getLine; return (); putStrLn s}
eso se ejecutaría bien.Not in scope: `when'
paratest = do (when True (putStrLn "Hello"))
.when
requiereimport Control.Monad
en la parte superior del archivo.Puede utilizar Hoogle para encontrar funciones, en este caso:
when
.En Hoogle, puede ingresar la firma del tipo, e intentará encontrar funciones coincidentes en las bibliotecas estándar unificando los tipos y reordenando los argumentos.
En su caso, simplemente puede ingresar el tipo de su
doIf
función: Bool -> IO () -> IO () .when
es la tercera respuesta aquí, su reversounless
también está allí.fuente