malentendido de entrada simple en haskell

import System.IO
import Data.Char
edastaNr n
   = do
      putStrLn "Anna rida:"
      line <- getLine
      if null line
         then return () 
         else do return length(line)

¿Alguien puede explicar por qué la última línea es incorrecta y cómo es posible solucionarlo? No me doy cuenta.. el error es:

Couldn't match expected type `IO ()' with actual type `[a0] -> Int'

preguntado el 22 de mayo de 12 a las 19:05

1 Respuestas

Le faltan paréntesis.

...
else do return (length line)

Sin embargo, también hay errores tipográficos. ¿Cuál es el tipo de su edasaNr ¿función? Debe hacer algo de IO y devolver un Int, cuando se le da un argumento.

Entonces sería mejor escribirlo como:

edastaNr :: a -> IO Int
edastaNr n = do
    putStrLn "Anna rida:"
    line <- getLine
    if null line
     then return 0
     else return $ length line

lo que también revela que no usas el n argumento (por lo que puede tener cualquier tipo).

contestado el 22 de mayo de 12 a las 19:05

Además, desde null line implica length line == 0, esto significa que ni siquiera necesitas un condicional. - Daniel Wagner

El tipo a -> IO Int ya no implica que no use el argumento, al menos para algún significado de "uso"--foo n = seq n $ return 0 - Felipe JF

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.