重新定义IO以简化调试?

Eri*_*ikR 14 monads haskell

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

和约.通过甲板75%的方式有一个要点"重新定义IO以简化调试!"

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

Jed*_*dai 10

那么,如果不是IO,你使用了一个模拟具有完美控制和规定环境的I/O的monad?您可以轻松地测试这些"IO"操作,就像它们是纯函数一样.这就是IOSpec背后的想法,它可以让您更精确地指定您希望在模拟IO中允许哪种效果,您可以写:

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

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