putstrln print interact haskell io

print - putstrln haskell



Salida Integer a stdout en Haskell (2)

Tengo una función simple como:

nth :: Integer -> Integer

Y trato de imprimir su resultado de la siguiente manera:

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

Se genera 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 probé con putStrLn y muchas otras combinaciones sin suerte.
No puedo resolverlo y necesitaría ayuda, ya que no entiendo completamente cómo funcionan las cosas con estos IO .


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

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


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 tu programa. do es azúcar sintáctica para la función más explícita que se escribiría de la siguiente manera:

Recuerde que (>>=) :: ma -> (a -> mb) -> mb

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 .