如何在SmallCheck中使用monadic属性?

时间:2013-10-30 03:37:31

标签: testing haskell monads smallcheck

我想写一个使用IO的SmallCheck属性,但我无法弄清楚我应该怎么做。具体来说,目标是编写一个Testable IO Bool实例的属性,以便我可以将其提供给smallCheck(或testProperty中的test-framework)。不幸的是,我能想到的最好的是:

smallCheck 5 (\(x :: Int) → return True :: IO Bool)

这不起作用,因为它是Testable IO (IO Bool)而不是Testable IO Bool的实例,但我无法弄清楚如何重写它以使其有效。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

你想要monadic组合子。它需要一个任意的monad m并将其包装成Property Testable的实例。

smallCheck 5  $ \(x :: Int) -> monadic $ (return True :: IO Bool)

答案 1 :(得分:1)

事实证明,有一个功能完全符合我的要求:

monadic :: Testable m a => m a -> Property m

你这样使用它:

smallCheck 5 $ \(x :: Int) → monadic (putStrLn (show x) >> return True)

具体来说,请注意函数参数后monadic如何嵌套