putstrln print haskell syntax io

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.