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

和大约。在甲板上75%的方式中有一个要点:“重新定义IO以简化调试!”

这看起来是一个非常有趣的想法!
有人可以举例说明说话者在说什么吗?

最佳答案

好吧,如果您使用monad而不是IO来模拟具有完美控制和规定环境的I / O呢?您可以轻松地测试那些“IO”操作,就像它们是纯函数一样。这就是IOSpec背后的想法,它甚至可以通过允许您精确指定要在模拟IO中允许的效果来进一步扩展,您可以编写:

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

(teletype支持终端功能,IORefS供参考)
然后例如在quickcheck属性中测试您的功能(请参阅VM模块和runIOSpec),并完全控制输入和输出,甚至逐步控制GHCI。并且,如果工作正常,只需更改导入以引入Test.IOSpec.Surrogate,即可将IOSpec f重新定义为IO的同义词。

09-10 20:57