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
.