putstrln - print haskell
Haskell "no hacer nada" IO, o si no hubiera más (2)
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 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 conformaría con él 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. De nuevo, no me sorprendería encontrar algo integrado que ya exista.
¿Cuál es la forma preferida de hacer esto?
La forma más fácil de hacer una no-operación en una mónada es:
return ()
Sin embargo, para el idioma particular que estás haciendo, ya hay un combinador hecho para ti:
import Control.Monad
main = do s <- getLine
when (s == "foo") $ putStr "You entered foo"
Esto when combinador se comporta exactamente como tu doIf combinator :)
Puedes usar Hoogle para encontrar funciones, en este caso: when
.
En Hoogle, puede ingresar la firma de tipo e intentará buscar funciones coincidentes en las bibliotecas estándar unificando los tipos y reordenando los argumentos.
En su caso, puede simplemente ingresar el tipo de su función doIf
: Bool -> IO () -> IO () . when
es la tercera respuesta aquí, es inversa, a unless
que también exista.