2012-04-21 15 views
8

Tengo una función simple como:salida de entero a la salida estándar en Haskell

nth :: Integer -> Integer 

y trato de imprimir que es el resultado de la siguiente manera: se genera

main = do 
    n <- getLine 
    result <- nth (read n :: Integer) 
    print result 

el siguiente error:

Couldn't match expected type `IO t0' with actual type `Integer' 
In the return type of a call of `nth' 
In a stmt of a 'do' expression: 
    result <- nth (read n :: Integer) 

También intenté con putStrLn y muchas otras combinaciones sin suerte.
No puedo entenderlo y necesitaría ayuda, ya que no entiendo completamente cómo funcionan las cosas en torno a estos IO s.

+2

one-liner: 'main = print. enésimo read = << getLine' – JJJ

Respuesta

12

nth es una función, no una acción IO:

main = do 
    n <- getLine 
    let result = nth (read n :: Integer) 
    print result 
+0

¡Genial! Pero, ¿por qué es eso así? –

+0

Porque no hace ninguna E/S ...? –

+1

Hacer sintaxis y binds ('x <- action') solo se usa para Monads. Si eres un principiante, es probable que la única mónada que usas sea 'IO'. si su función no está en la forma 'func :: a -> IO b' o simplemente' func :: IO b', entonces no puede usar bind pero puede usar una instrucción let. –

4

La sintaxis do desenvuelve algo dentro de una mónada. Todo en el lado derecho de la flecha debe vivir dentro de la mónada IO, de lo contrario, los tipos no se verifican. Un IO Integer estaría bien en su programa. do es el azúcar sintáctica para la función más explícita que se escribe como sigue:

Recordemos que (>>=) :: m a -> (a -> m b) -> m b

main = getLine >>= (\x -> 
     nth >>= (\y -> 
     print y)) 

Pero nth no es un valor monádico, por lo que no tiene sentido aplicar la función (>>=) , que requiere algo con el tipo IO a.

+0

Gracias, ahora estoy como "Oh, así que de aquí salió el esperado' m0 a0' que estaba recibiendo ... " –

+1

Para aclarar un poco más,' m0' proviene del hecho de que '(>> =) :: Monad m => ma -> (a -> mb) -> mb'. Funciona para cualquier mónada, no solo 'IO', y en su caso el compilador no tuvo la oportunidad de descubrir que' m' es 'IO', por lo que puso' m0' en el mensaje de error. – nponeccop

Cuestiones relacionadas