重新定义IO以简化调试?

时间:2012-03-11 16:31:37

标签: haskell monads

我一直在浏览http://www.algorithm.com.au/downloads/talks/monads-are-not-scary/monads-are-not-scary-chak.pdf

的幻灯片

和约。通过甲板75%的方法有一个要点“重新定义IO以简化调试!”

这看起来像一个非常有趣的想法! 有人可以举一个说话者正在谈论的实际例子吗?

1 个答案:

答案 0 :(得分:10)

那么,如果不使用IO,你使用了一个模拟具有完美控制和规定环境的I / O的monad?您可以轻松地测试这些“IO”操作,就像它们是纯函数一样。这就是IOSpec背后的想法,通过允许您准确指定模拟IO中允许的效果类型,您可以写得更远:

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

(电传打字机允许终端功能,IORefS参考) 然后在quickcheck属性中测试您的函数(参见VM模块和runIOSpec),完全控制输入和输出,甚至在GHCI中逐步控制。如果它正常工作,只需更改导入以引入Test.IOSpec.Surrogate,它将IOSpec f重新定义为IO的同义词。