Testing 在SmallCheck中如何使用一元属性?

Testing 在SmallCheck中如何使用一元属性?,testing,haskell,monads,smallcheck,Testing,Haskell,Monads,Smallcheck,我想写一个使用IO的SmallCheck属性,但我不知道该怎么做。具体来说,目标是编写一个属性,它是可测试IO Bool的实例,这样我就可以将它输入smallCheck(或者测试框架中的测试属性)。不幸的是,我能想出的最好办法是: smallCheck 5 (\(x :: Int) → return True :: IO Bool) 这不起作用,因为它是可测试IO(IO Bool)的一个实例,而不是可测试IO Bool,但我不知道如何重写它才能工作 任何帮助都将不胜感激。事实证明,有一个函数可

我想写一个使用IO的SmallCheck属性,但我不知道该怎么做。具体来说,目标是编写一个属性,它是
可测试IO Bool
的实例,这样我就可以将它输入
smallCheck
(或者
测试框架中的
测试属性
)。不幸的是,我能想出的最好办法是:

smallCheck 5 (\(x :: Int) → return True :: IO Bool)
这不起作用,因为它是
可测试IO(IO Bool)
的一个实例,而不是
可测试IO Bool
,但我不知道如何重写它才能工作


任何帮助都将不胜感激。

事实证明,有一个函数可以完全满足我的要求:

monadic :: Testable m a => m a -> Property m
你这样使用它:

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

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

您需要
monadic
组合器。它接受一个任意的monad
m
,并将其包装成一个
属性
,该属性是
可测试的
的实例

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