procesando la entrada en haskell
Pregunta
Necesito obtener una entrada hasta que se ingresa la línea vacía y cuando se ingresa la línea vacía necesito imprimir todos los primeros caracteres de cada línea (como una palabra).¿Alguien puede explicar qué debo escribir en la última línea?
inp :: IO String
inp
= do
line <- getLine
if null line
then return ""
else do
lines <- inp
return lines????
Solución
No quiero estropearlo todo, pero aquí hay algunos consejos:
String
en realidad es solo otro nombre para[Char]
.- Puedes construir una nueva lista que sea como una antigua, pero con un nuevo elemento pegado al frente con el
(:) :: a -> [a] -> [a]
función (y en particular,(:) :: Char -> String -> String
).Puede leer esta función en voz alta como "contras".Por ejemplo,1:[2,3,4]
es lo mismo que[1,2,3,4]
, y'a':"bcd"
es lo mismo que"abcd"
. - Cuando esté seguro de que una lista no está vacía, puede solicitar su primer elemento con el
head :: [a] -> a
función (y en particular,head :: String -> Char
). - Como estrategia alternativa, es posible que desee considerar la coincidencia de patrones En lugar de usar
null
yif
/then
/else
;Esto también elimina la necesidad dehead
, que suele ser un olor a código.
A partir de un comentario, también probaste algo como esto como última línea:
return head(lines) : []
El principal problema aquí es que return
no es una palabra clave en Haskell, es simplemente una función antigua.Entonces, si su argumento es una expresión, debe ponerlo entre paréntesis (o usar uno de los diversos trucos para evitar los paréntesis):
return (head(lines) : [])
return (head lines : [])
return $ head lines : []
return [head lines]
let answer = head lines : [] in return answer
etc.Esto debería llevarlo a donde se verifican y ejecutan las cosas;entonces podrás empezar a corregir los errores en el comportamiento del código.=)