【问题标题】:How does one use monadic properties in SmallCheck?如何在 SmallCheck 中使用一元属性?
【发布时间】:2013-10-30 03:37:31
【问题描述】:
我想编写一个使用 IO 的 SmallCheck 属性,但我不知道应该怎么做。具体来说,目标是编写一个作为Testable IO Bool 实例的属性,以便我可以将其输入smallCheck(或test-framework 中的testProperty)。不幸的是,我能想到的最好的方法如下:
smallCheck 5 (\(x :: Int) → return True :: IO Bool)
这不起作用,因为它是 Testable IO (IO Bool) 而不是 Testable IO Bool 的实例,但我不知道如何重写它以使其正常工作。
任何帮助将不胜感激。
【问题讨论】:
标签:
testing
haskell
monads
smallcheck
【解决方案1】:
你想要monadic 组合子。它采用任意 monad m 并将其包装到 Property 中,这是 Testable 的一个实例。
smallCheck 5 $ \(x :: Int) -> monadic $ (return True :: IO Bool)
【解决方案2】:
事实证明,有一个函数完全符合我的要求:
monadic :: Testable m a => m a -> Property m
你这样使用它:
smallCheck 5 $ \(x :: Int) → monadic (putStrLn (show x) >> return True)
具体来说,注意monadic 需要如何嵌套在函数参数之后。