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????
¿Fue útil?

Solución

No quiero estropearlo todo, pero aquí hay algunos consejos:

  1. String en realidad es solo otro nombre para [Char].
  2. 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".
  3. 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).
  4. Como estrategia alternativa, es posible que desee considerar la coincidencia de patrones En lugar de usar null y if/then/else;Esto también elimina la necesidad de head, 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.=)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top