Mientras juego con mónadas a menudo incurro en problemas de evaluación. Ahora, entiendo los conceptos básicos de evaluación perezosa, pero no entiendo cómo las mónadas se evalúan perezosamente en Haskell.evaluación de Haskell y perezosas Mónadas
Considere el siguiente código
module Main where
import Control.Monad
import Control.Applicative
import System
main = print <$> head <$> getArgs
En mi mente se debe a la función principal debe imprimir el primer argumento de la consola, pero no es así.
sé que
getArgs :: IO [String]
head <$> getArgs :: IO String
print <$> (head <$> getArgs) :: IO (IO())
main :: IO (IO())
lo que al parecer, el primer argumento no se imprime en la salida estándar debido a que el contenido de la primera mónada IO no se evalúa. Entonces, si me uno a las dos mónadas, funciona.
main = join $ print <$> head <$> getArgs
¿Alguien podría aclararlo por mí? (O me da un puntero)
Muchas gracias por la respuesta exhaustiva. – Jack
Así que, básicamente, lo que hice fue ejecutar getArgs (el IO externo) y arrojar los resultados en algo que nunca se ejecutó (porque lo ignoró el principal). – Jack
Correcto. Tu código ejecuta 'head <$> getArgs' y luego envía su resultado a' return. print', que tiene el tipo 'a -> IO (IO())'. –