过去的纸质问题问我; 定义一个函数p :: [a] - > [a],它交换列表中的每两个项目.您的函数应该将第一个项与第二个项交换,第三个与第四个项交换,依此类推.通过递归来定义列表理解中的另一个.
这就是我提出的:
import Test.QuickCheck
p :: [a] -> [a]
p [] = []
p xs = concat [ [y,x] | ((x,y),i) <- zip (zip xs (tail xs)) [1..], odd i]
q :: [a] -> [a]
q [] = []
q (x:y:zs) | even (length zs) = [y,x] ++ q zs
| otherwise = error "The list provided is not of even length"
prop_2 xs = even (length xs) ==> p xs == q xs …Run Code Online (Sandbox Code Playgroud) 我正在努力解决这个问题 - QuickCheck如何为所有类型生成一个值?也许它可以伪造它,并且只测试具有上下文的类型Arbitrary a => a?
我只是想知道有人如何为存在类型的数据构造函数创建一个任意的实例:
data Foo a = Foo a (forall b. (a -> b, b -> a))
Run Code Online (Sandbox Code Playgroud) 我想写一个如下属性:
(prop/for-all [x (gen/nat)
y (gen/nat)]
(= (g x y) (f x y)))
Run Code Online (Sandbox Code Playgroud)
但是,该物业仅在何时持有x > y.表达此属性的前提条件的正确方法是什么?(更好的是,我怎么能写出这个属性,这个属性y生成的自然数小于x?)
作为我学习的一部分,我quickCheck想为levenshtein编辑距离实现构建一个测试生成器.我认为显而易见的方法是从两个相等的字符串和一个随机的非可还原系列的插入/删除/ traspose操作开始,将其应用于其中一个字符串并断言levenshtein距离是随机序列的长度.
我很坚持这可以有人帮忙吗?
我想Arbitrary为以下newtype 创建一个实例,以便将其用于QuickCheck:
newtype Wrapmaybe a = Wrapmaybe {getMaybe :: Maybe a} deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
我知道Arbitrary实例Maybe可以写成如下:
instance Arbitrary a => Arbitrary (Maybe a) where
arbitrary = frequency [(1, return Nothing), (1, liftM Just arbitrary)]
Run Code Online (Sandbox Code Playgroud)
如何Arbitrary在不出现类型错误或类型错误的情况下为以下内容编写实例:
instance Arbitrary a => Arbitrary (Wrapmaybe Maybe a) where
etc...
Run Code Online (Sandbox Code Playgroud) 我想使用Haskell Test.QuickCheck生成一些示例测试
目标是使用以下条件生成(Int,[Int])的数据,其中元组是(x,xs):
经过一段时间后,我可以抓住我的脑袋并绊倒手册https://github.com/stackbuilders/quickcheck-manual,我可以生成符合这些要求的随机列表:
import Test.QuickCheck
mygen = arbitrary::Gen (Int, [Int]))
sample (mygen `suchThat` ( \(x, xs)->( (x `notElem` xs) && (x > 0) && (all (>0) xs)&& (xs/=[]))))
Run Code Online (Sandbox Code Playgroud)
在GHCI中运行最后一行输出如下:
(40,[19,35,27,29,45,1,17,28])
(20,[3,9,11,12,15,8])
(43,[76,102,106,71,24,2,29,101,59,48])
(99,[5,87,136,131,22,22,133])
(77,[11,14,55,47,78,15,14])
...
Run Code Online (Sandbox Code Playgroud)
问题:
如何才能更有效地完成这项工作,因为 - 我猜测 - mygen创建一个大样本集的函数然后根据suchThat标准过滤掉
如何指示列表xs应该具有一定的大小.例如,如果我添加&& length xs > 50程序运行很长一段时间.
保证xs的每个元素都是唯一的.即避免像(99,[22,22])这样的记录
Go 不会在不同包的测试文件之间共享代码,因此测试接口的定义不会自动重用。在实践中我们如何解决这个问题?
testing/quick:foo/foo.go:
package foo
type Thing int
const (
X Thing = iota
Y
Z
)
Run Code Online (Sandbox Code Playgroud)
bar/bar.go:
package bar
import (
"foo"
)
type Box struct {
Thing foo.Thing
}
Run Code Online (Sandbox Code Playgroud)
我们想要测试属性foo,所以我们testing/quick.Generate定义Thing:
foo_test.go:
package foo
import (
"math/rand"
"reflect"
"testing"
"testing/quick"
"time"
)
func (_ Thing) Generate(r *rand.Rand, sz int) reflect.Value {
return reflect.ValueOf(Thing(r.Intn(3)))
}
func TestGenThing(t *testing.T) {
r := rand.New(rand.NewSource(time.Now().UTC().UnixNano()))
for i := 0; i < …Run Code Online (Sandbox Code Playgroud) 我为我的Haskell项目构建了初始代码库,我cabal init
用Hspec编写了几个测试.在cabal test它上编译和运行这些测试,如预期,并给出失败/传递的消息.
现在我加入了一个quickCheck测试,即使测试失败,终端输出也无法识别quickCheck测试.
但在dist/test/dir中我可以看到测试日志 *** Failed! ...
有没有办法在测试工作流程中"包含"quickCheck测试.因此,我不必在每次测试运行后查看测试日志.
import Test.Hspec
import Test.QuickCheck
spec :: Spec
spec = do
describe "myTest" $ do
it "Something something" $ do
myTest "" `shouldBe` False
quickCheckWith stdArgs { maxSuccess = 1000 } prop_myTest -- <== ?
Run Code Online (Sandbox Code Playgroud) 我有以下代码用于在以下网站上创建挑战:codewars
describe "Random cases" $ do
it "It should handle random test cases" $
property $ prop_check where
prop_check (Positive x) = solution x == ref_sol x
--- ref_sol function
Run Code Online (Sandbox Code Playgroud)
我想将xprop_check 中的值设置为大于 4 的正整数,并且最多为五位数字(不超过五位数字,即:最大值 = 99999)。
我该如何接近它呢?
所以我有下面的代码,我试图将其作为一个实例Arbitrary:
data MyData = I Int | B Bool\n\ninstance Arbitrary MyData where\n arbitrary = do {\n frequency [(1, return (I 1)),\n (1, return (choose((B True), (B False))))]\n }\nRun Code Online (Sandbox Code Playgroud)\n然而,我得到了(可以理解的)错误:
\nCouldn't match type \xe2\x80\x98Gen MyData\xe2\x80\x99 with \xe2\x80\x98MyData\xe2\x80\x99\n Expected type: Gen MyData\n Actual type: Gen (Gen MyData)\nRun Code Online (Sandbox Code Playgroud)\n我怎样才能实现这一目标?另外,I 1我想返回I一个随机的而不是 () Int。然而,使用该arbitrary函数而不是1会导致相同的错误。