我想写一个使用IO的SmallCheck属性,但我无法弄清楚我应该怎么做。具体来说,目标是编写一个Testable IO Bool
实例的属性,以便我可以将其提供给smallCheck
(或testProperty
中的test-framework
)。不幸的是,我能想到的最好的是:
smallCheck 5 (\(x :: Int) → return True :: IO Bool)
这不起作用,因为它是Testable IO (IO Bool)
而不是Testable IO Bool
的实例,但我无法弄清楚如何重写它以使其有效。
任何帮助都将不胜感激。
答案 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
如何嵌套。