Haskell es un lenguaje funcional puro, lo que significa que las funciones de Haskell no tienen efectos secundarios. La E/S se implementa utilizando mónadas que representan fragmentos de cómputo de E/S.¿Es posible probar el valor de retorno de las funciones de E/S de Haskell?
¿Es posible probar el valor de retorno de las funciones de E/S de Haskell?
Digamos que tenemos un simple 'hola mundo' programa:
main :: IO()
main = putStr "Hello world!"
¿Es posible para mí para crear un instrumento de prueba que se pueden ejecutar main
y comprobar que la mónada de E/S devuelve la correcta 'valor'? ¿O el hecho de que las mónadas se supone que son bloques opacos de computación me impide hacer esto?
Nota, no estoy tratando de comparar los valores de retorno de las acciones de E/S. Quiero comparar el valor de retorno de las funciones de E/S - la mónada de E/S en sí.
Dado que en Haskell E/S se devuelve en lugar de ejecutarse, esperaba examinar el trozo de computación de E/S devuelto por una función de E/S y ver si era correcto o no. Pensé que esto podría permitir que las funciones de E/S fueran probadas en unidades de una manera que no pueden hacerlo en los idiomas imperativos donde E/S es un efecto secundario.
Las mónadas no son necesariamente bloques "opacos" de computación. Por ejemplo, las mónadas List y Maybe tienen un comportamiento visible a la aplicación; la mónada IO es la única (que yo conozco) específicamente diseñada para aislar la lógica del programa de parte de su comportamiento. –
Control.Monad.ST también es bastante opaco. – ephemient
No soy exactamente bueno con las cosas de Computational Theory. Pero, ¿no es esto equivalente al problema de la detención? Quiero decir, tendrías una función que devuelve un programa (la acción IO) y deseas escribir otro programa para analizarla de manera estática para verificar que sea correcta. ¿Es esa una forma válida de describir el problema? ¿Esto es decidible? –