es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se pudo hacer coincidir el tipo `Char’ con `[Char]’

Quiero un programa que tome líneas y las imprima al revés cuando encuentra una línea vacía.
Este es mi código.

back :: IO()
back = do
  line <- getLine 
  if (not $ null line) then do
  mapM_ putStrLn (reverse line)
  else return()

Cuando intento ejecutar esto, da un error.

* No se pudo hacer coincidir el tipo `Char' con `[Char]'
      Esperado: [String]
        Actual: [Char]
    * En el segundo argumento de `mapM_', a saber, `(reverse line)'
      En una declaración de un bloque `do': mapM_ putStrLn (reverse line)
      En la expresión: do mapM_ putStrLn (reverse line)
  |
6 |     mapM_ putStrLn(reverse line)
  |                    ^^^^^^^^^^^^

¿Qué está saliendo mal aquí?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error se debe a que la función reverse solo funciona en una lista de elementos (por ejemplo, [1, 2, 3]), pero line es una cadena de texto (por ejemplo, "hello world"), la cual es una lista de caracteres. Para solucionar esto, puedes dividir la cadena de texto en una lista de líneas usando la función lines y luego llamar a reverse en cada línea:

    back :: IO ()
    back = do
      line <- getLine
      if null line
        then return ()
        else do
          mapM_ putStrLn (map reverse (lines line))
          back
    

    Aquí, lines divide la cadena de entrada en una lista de líneas (usando saltos de línea como delimitador), y map reverse aplica la función reverse a cada línea.

    La función back se llama a sí misma de forma recursiva para seguir leyendo la entrada hasta que el usuario cierre el programa.

Comments are closed.