我正在使用QuickCheck v1.这是一个简单的prop_xxx定义如下:
prop_foo :: (Num a) =>[a] -> Bool
prop_foo xs = (reverse.reverse) xs == id xs
Run Code Online (Sandbox Code Playgroud)
这可以在GHCi中正确测试:quickCheck prop_foo
但是,当我尝试在以下函数中包装调用时:
f :: IO ()
f = quickCheck prop_foo
Run Code Online (Sandbox Code Playgroud)
它报告了错误:
Ambiguous type variable `a' in the constraints:
`Num a' arising from a use of `prop_foo' at Foo.hs:147:15-22
`Arbitrary a'
arising from a use of `quickCheck' at Foo.hs:147:4-22
Probable fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)
我应该提供类似的东西
instance Arbitrary Xxx where
arbitrary = ...
coarbitrary c = ...
Run Code Online (Sandbox Code Playgroud)
非常感谢. …
我正在学习quickcheck(和haskell),我有de bellow代码:
newtype Urls = FN { unFN :: String } deriving Show
instance Arbitrary Urls where
arbitrary = do protocol <- elements ["http://"]
name <- listOf $ elements ['a'..'z']
domain <- elements [".com",".com.br",".net"]
return (FN (protocol ++ name ++ domain))
Run Code Online (Sandbox Code Playgroud)
我的问题是关于我如何使listOf永远不会返回空(NonEmpty),因为现在对于生成的一些数据我收到像{unFN ="http://.net"}这样的字符串,简化了我希望该名称永远不会为空
而不是发明我自己的,对于典型的Haskell任务,例如编译,打包,hlint,quickcheck等,有什么好的makefile规则?
在搜索中我发现像这样的例子:
ghc -M *.hs
Run Code Online (Sandbox Code Playgroud) 我写了一些使用repa 计算距离矩阵的代码:
distance :: Int -> Int -> Mat -> Double
distance aindx bindx arr = let a = slice arr (Any :. aindx :. All)
b = slice arr (Any :. bindx :. All)-
sqdiff = R.map (\x -> x*x) $ R.zipWith (-) a b
in sqrt $ sumAllS sqdiff
buildDistanceMatrix :: Mat -> Mat
buildDistanceMatrix m = let (Z :. height :. width) = R.extent m
cords = fromListUnboxed (Z :. (height * height) ) [ (x,y) …Run Code Online (Sandbox Code Playgroud) 我想从无限的浮动列表中进行采样,以便进行QuickCheck消费.但是,由于我打算使用除法,我想从该列表中删除零.这是一个概念上简单的问题,我想知道我是否可以用列表理解来做,如果没有,哪个是在Haskell中实现这个的最简单方法?
[x | x <- floats, x /= 0] -- this seems reasonable, but where do I get floats from?
Run Code Online (Sandbox Code Playgroud)
我目前的解决方法(哎呀):
import Test.QuickTest
divGen :: Gen (Maybe Float)
divGen = do
x <- arbitrary
if x /= 0
then return $ Just x
else return Nothing
Run Code Online (Sandbox Code Playgroud) 我正在使用Functors和QuickCheck进行练习.
我有一个超级简单的Functor,其组成法我想快速检查.Functor简直就是一个Identity a.这是我到目前为止的代码:
import Data.Functor
import Test.QuickCheck
newtype Identity a = Identity a
instance (Eq a) => Eq (Identity a) where
(==) (Identity x) (Identity y) = x == y
(/=) (Identity x) (Identity y) = x /= y
instance Functor Identity where
fmap f (Identity x) = Identity (f x)
propertyFunctorCompose ::(Eq (f c), Functor f) => (a -> b) -> (b -> c) -> f a -> Bool
propertyFunctorCompose f g fr = (fmap (g . …Run Code Online (Sandbox Code Playgroud) 我的ghci版本是8.4.3
我试过了
stack install QuickCheck
Run Code Online (Sandbox Code Playgroud)
已安装某些东西。但是当我输入时import Test.QuickCheck,它会Could not find module ‘Test.QuickCheck’再次显示。我该如何解决?
我有一个quickCheck属性,它涉及为只有两个元素的和类型生成元素.
显然,对于这种情况,默认的测试用例数量100太多,因此我习惯withMaxSuccess将案例数量减少到3.这样运行得很快但由于两个原因并不理想.首先,运行的三个测试用例超过了所需的两个测试用例.其次,这三个案例并不全面,因为四分之一的机会都是三个相同的因素,而另一个则排除在外.
我已经尝试过QuickCheck的forAll修饰符,看起来它可能正在寻找我想要的东西,但运行的测试用例数仍然是100.
如果我有一个具有有限数量元素的类型作为QuickCheck测试的生成器,有没有办法设置QuickCheck通过每个元素运行一次来全面测试该属性?
要限定类型是否具有有限数量的元素,也许它可以由类Enum和Bounded类型限定.
我希望下面的代码生成一个大小为1,2或3的列表生成器,每个元素都是独立生成的.
shortlist :: Arbitrary a => Gen [a]
shortlist = oneof $ map promote [[arbitrary],
[arbitrary, arbitrary],
[arbitrary, arbitrary, arbitrary]]
Run Code Online (Sandbox Code Playgroud)
REPL:
sample (shortlist :: Gen [Char])
"\255\255\255"
"ii"
"FF"
"\236\236"
"FF"
"'''"
"8"
"HH"
"\160"
"\DEL\DEL\DEL"
"\246\246"
Run Code Online (Sandbox Code Playgroud)
每个列表包含相同char的1,2或3个实例.为什么武断不按预期行事?
最近,我一直在使用Haskell和QuickCheck进行自动测试.有些时候我有一些失败,但程序检索[(),()]为检查参数.
什么"[(),()]"意思?