tuplas sobre reservadas para palabras operadores logicos inteligencia funciones entornos ejemplos desarrollo ciclos artificial aritmeticos haskell monads io-monad

sobre - operadores logicos y aritmeticos en haskell



¿Por qué no se puede engañar a Haskell para que realice operaciones de E/S utilizando una evaluación estricta? (2)

Estoy aprendiendo las mónadas de Haskell y IO. Me pregunto por qué esto no forzaría al programa a emitir "hi" así como a "bye":

second a b = b main = print ((second $! ((print "hi") >>= (/r -> return ()))) "bye")

Por lo que yo entiendo, el $! el operador obligaría a evaluar el primer argumento del second , y el operador >>= tendría que ejecutar la print "hi" para obtener un valor y pasarlo a /r -> return () , que se imprimiría "Hola" a la pantalla.

¿Qué hay de malo con mi razonamiento?

Y también, ¿hay alguna manera de probar que Haskell no pueda ser engañado (aparte de usar funciones no seguras) para ejecutar operaciones de IO dentro del código "seguro"?


Estás confundiendo la evaluación con la ejecución . Cuando fuerza una expresión como print "hi" , no se imprime nada. Simplemente produce un valor (en este caso, un valor de tipo IO() ) que representa la acción de imprimir algo. Puede pensar en el valor de la print "hi" como una receta para imprimir "hi".


La expresión que está forzando es ((print "hi") >>= (/r -> return ())) , que es de tipo IO () . Como tal, representa una acción IO. ¡Pero evaluar tal cosa es muy diferente de ejecutarla !

Evaluar un valor significa realizar solo los pasos necesarios para convertirlo en lo que se denomina forma normal de cabeza débil . Debido a que IO es abstracto, es un poco difícil ver lo que eso significa en este caso, pero se puede pensar en IO a como RealWorld -> (a, RealWorld) , y luego la forma normal de cabeza débil es, bueno, una función en espera para ser dado el mundo RealWorld .

La ejecución implica una evaluación, pero también pasa el RealWorld como un argumento, lo que provoca que se produzca el efecto IO .

Todo esto no es muy específico de IO ; su confusión y los conceptos se aplican por igual a a -> b . Si entiendes que $! Cuando el segundo argumento es una función, entenderá qué sucede cuando se trata de una acción de E / S.