Menú

   

Actualizado

 

Ampliación de Programación - Haskell

Entrada y Salida en Haskell

Puedes leer este capítulo [capítulo] del [tutorial de Haskell] como introducción a las operaciones de entrada y salida en Haskell.

Ejercicios

  1. Define una función putString :: String -> IO () usando [putChar] . Da una definición usando (>>=), y otra usando la notación do.  (Esta función está predefinida como [putStr] .

  2. Escribe un programa que pida un número del teclado y muestre su factorial.

  3. Define una función runIO_ :: [IO ()] -> IO () que tome una lista de acciones y las ejecute secuencialmente. Por ejemplo, runIO_ [ putStr "hola", putStr "mundo" ] muestra por pantalla la cadena "holamundo". (Esta función está predefinida como [sequence_] ).

  4. Define una función runIO :: [IO a] -> IO [a] que tome una lista de acciones y las ejecute secuencialmente, devolviendo en una lista los resultados de cada una. Por ejemplo,

    Main> do {xs <- runIO [return 24, readLn]; print xs}
    4
    [24,4] 
    (Esta función está predefinida como [sequence] ).
  5. Define la función  putString usando  [map] y [sequence_] .

  6. La función  [mapM_] está predefinida del siguiente modo:

    mapM_ :: (a -> IO b) -> [a] -> IO ()
    mapM_ f = sequence_ . map f
    
    Define la función  putString usando  mapM_
  7. Define una función forIO :: [a] -> (a -> IO ()) -> IO () que simule un bucle for de un lenguaje imperativo. Por ejemplo, el programa

    prog2 :: IO ()
    prog2 = forIO [1..5] acc
      where
       acc i = do { putStr ("El factorial de "
                  ; putStr (show i)
                  ; putStr " es "
                  ; putStrLn (show (fact i))
                  }
       fact 0       = 1
       fact m@(n+1) = m*fact n
    

    produce la siguiente salida:

    El factorial de 1 es 1
    El factorial de 2 es 2
    El factorial de 3 es 6
    El factorial de 4 es 24
    El factorial de 5 es 120                    
  8. Define una función when :: Bool -> IO () -> IO () que ejecute una acción solo si una condición es verdadera.Por ejemplo,

    prog3 :: IO ()
    prog3 = do { putStr "Dame un número: "
               ; n <- readLn
               ; when (n>=0) (putStr "Es positivo")
               ; when (n<0)  (putStr "Es negativo")
               }
    

     (Esta función está definida en la biblioteca [Monad] ).

  9. Escribe un programa que lea un fichero de texto que contiene palabras (una por línea) y genere un nuevo fichero con las palabras ordenadas (también una por línea). Puedes usar las funciones predefinidas  [lines][unlines] .