que quiero hacer algo en Haskell que tiene este aspecto:Haskell "no hacer nada" IO, o si otra persona sin
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
Obviamente, esto no es legal ya que no hay else
. Una alternativa 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 gustaría conformarme con él si es necesario. Sin embargo, me sorprendería que no hubiera una versión incorporada de nop
.
alternativa:
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. De nuevo, no me sorprendería encontrar algo integrado que ya exista.
¿Cuál es la forma preferida de hacer esto?
Whoops, pensé en return() pero estaba pensando que en realidad volvería (es decir, cortocircuitar el resto de las cosas en la expresión de do). Mi error. Gracias por el puntero a cuándo. –
return es una especie de mal nombre, sí :) – bdonlan
@Dave Tenga en cuenta que '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 así, podrías escribir: 'do {s <- getLine; regreso(); putStrLn s} 'que se ejecutará bien. –