2012-03-11 14 views

Respuesta

10

Bueno, ¿y si en lugar de IO, que utilizó una mónada que simula E/S con un entorno perfectamente controlado y estipulado? Podrías probar fácilmente esas acciones "IO" como si fueran funciones puras. Esta es la idea detrás de, por ejemplo, IOSpec, que va aún más lejos por lo que le permite especificar con precisión qué tipo de efecto que desea permitir en su simulada IO, se podría escribir:

myFunction :: a -> b -> IOSpec (Teletype :+: IORefS) 
myFunction x y = do 
    ... 
    putStr (...) 
    ref <- newIORef ... 
    ... 

(teletipo permite las funciones del terminal, IORefS para referencias) Y luego pruebe su función en una propiedad quickcheck por ejemplo (vea el módulo VM y runIOSpec) con control completo sobre entrada y salida o incluso paso a paso en GHCI. Y si funciona correctamente, simplemente cambie la importación para introducir Test.IOSpec.Surrogate que redefina IOSpec f como sinónimo de IO.

Cuestiones relacionadas