2009-05-07 16 views
65

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?

Respuesta

90

La forma más sencilla de hacer un no-op en una mónada es:

return() 

Sin embargo, para el idioma en particular que está haciendo, hay un combinador ya hecha para usted:

import Control.Monad 
main = do s <- getLine 
      when (s == "foo") $ putStr "You entered foo" 
este

when combinador se comporta exactamente igual que el combinador DOIF :)

+0

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. –

+3

return es una especie de mal nombre, sí :) – bdonlan

+7

@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. –

17

puede utilizar Hoogle para encontrar funciones, en este caso: when .

En Hoogle, puede introducir 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í, su reverso unless está allí también.