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í?
davy.ai
El error se debe a que la función
reverse
solo funciona en una lista de elementos (por ejemplo,[1, 2, 3]
), peroline
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ónlines
y luego llamar areverse
en cada línea:Aquí,
lines
divide la cadena de entrada en una lista de líneas (usando saltos de línea como delimitador), ymap reverse
aplica la funciónreverse
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.