4

我想写一个使用 IO 的 SmallCheck 属性,但我不知道应该怎么做。具体来说,目标是编写一个属性,它是 的一个实例,Testable IO Bool以便我可以将它输入smallCheck(或testProperty输入test-framework)。不幸的是,我能想到的最好的方法如下:

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

这不起作用,因为它是Testable IO (IO Bool)而不是的实例Testable IO Bool,但我不知道如何重写它以使其工作。

任何帮助,将不胜感激。

4

2 回答 2

4

你想要monadic组合器。它接受一个任意的 monadm并将其包装成Property一个Testable.

smallCheck 5  $ \(x :: Int) -> monadic $ (return True :: IO Bool)
于 2013-10-30T03:57:38.910 回答
2

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

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

你像这样使用它:

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

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

于 2013-10-30T03:57:03.123 回答