我正在尝试在Ubuntu 10.04上通过cabal安装quickcheck 2。无论我尝试做什么,我总是会遇到以下问题:
$ cabal list quickcheck
* QuickCheck
Synopsis: Automatic testing of Haskell programs
Latest version available: 2.1.1.1
Latest version installed: 1.2.0.0
Homepage: http://www.cse.chalmers.se/~koen
License: BSD3
Run Code Online (Sandbox Code Playgroud)
这是在干净的Ubuntu 10.04上,仅安装了ghc6和cabal-install apt软件包。在尝试安装quickcheck之前,我已经通过cabal安装了二进制软件包。
它告诉我2.1.1.1可用,但只能安装1.2.0.0。为什么我无法真正安装最新版本?
经过一段令人沮丧的研究后,我正在写这篇文章,我希望这里有人能够启发我这个话题.
我想在haskell函数中生成一个简单的随机数,但是,如果没有各种非平凡的元素,例如Monads,"do"中的asignation,创建生成器等,这似乎是不可能的.
理想情况下,我正在寻找相当于C的"rand()".但经过多次搜索,我很确信没有这样的东西,因为语言是如何设计的.(如果有,请有人赐教).由于这似乎不可行,我想找到一种方法来获取我的特定问题的随机数,以及关于如何获得随机数的一般解释.
prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = frequency [
(1, return ([],[])),
(2, do {
xs1 <- orderedListEj13 ;
xs2 <- orderedListEj13 ;
return (xs1,xs2)
}),
(2, do {
xs2 <- orderedListEj13 ;
return ((take RANDOMNUMBERHERE xs2),xs2)
})
]
Run Code Online (Sandbox Code Playgroud)
我正试图掌握QuickCheck,但我无法使用随机数字使其变得困难.我试过像这样(通过把一个drawInt 0(长度XS2)替代RANDOMNUMBERHERE),但我卡住与采取需要诠释的事实和方法给我留下了一个IO诠释,这似乎是不可能转变成根据这个.
我为foldl编写了一个实现,并想检查它是否有效,我尝试了一些案例,它似乎运行良好,但我想确定.
我读了一下quickCheck并试了一下,但我似乎无法使它工作,这就是代码
foldl'' :: (b -> a -> b) -> b -> [a] -> b
test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool
test f e ls = foldl'' f e ls == foldl f e ls
Run Code Online (Sandbox Code Playgroud)
当我运行quickCheck test它时会抛出以下错误:
No instance for (Show (b0 -> a0 -> b0))
arising from a use of `quickCheck'
Possible fix:
add an instance declaration for (Show (b0 -> a0 -> b0))
In the expression: …Run Code Online (Sandbox Code Playgroud) 我已经看到QuickCheck如何用于测试monadic和非monadic代码,但是如何使用它来测试处理错误的代码,即打印一些消息然后调用exitWith?
给定一个任意树,我可以使用舒伯特编号在该树上构建一个子类型关系:
constructH :: Tree a -> Tree (Type a)
Run Code Online (Sandbox Code Playgroud)
其中Type嵌套原来的标签,并且还提供了执行父/子(或子类型)的检查所需要的数据.使用Schubert编号,两个Int参数就足够了.
data Type a where !Int -> !Int -> a -> Type a
Run Code Online (Sandbox Code Playgroud)
这导致二元谓词
subtypeOf :: Type a -> Type a -> Bool
Run Code Online (Sandbox Code Playgroud)
我现在想用QuickCheck测试这确实做了我想做的事情.但是,以下属性不起作用,因为QuickCheck只是放弃了:
subtypeSanity ? Tree (Type ()) ? Gen Prop
subtypeSanity Node { rootLabel = t, subForest = f } =
let subtypes = concatMap flatten f
in (not $ null subtypes) ==> conjoin
(forAll (elements subtypes) (\x ? x `subtypeOf` t):(map subtypeSanity f))
Run Code Online (Sandbox Code Playgroud)
如果我遗漏了递归调用subtypeSanity,即我传递给列表的尾部 …
我尝试编写一个FsCheck生成器,生成给定间隔长度的字符串.
我的尝试如下:
let genString minLength maxLength =
let isValidLength (s : string) =
s.Length >= minLength && s.Length <= maxLength
Arb.generate
|> Gen.suchThat isValidLength
|> Arb.fromGen
Run Code Online (Sandbox Code Playgroud)
......我收到错误:
"System.Exception : No instances of class FsCheck.Arbitrary`1[a] for type System.String with arguments set []"
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
谢谢!
更新1:
我设法写了这样的生成器:
let genStrings minLength maxLength =
gen {
let! length = Gen.choose (minLength, maxLength)
let! chars = Gen.arrayOfLength length Arb.generate<char>
return new String(chars)
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
更新2:我想将此作为一个单独的问题添加,但它与我原来的问题几乎相同.
所以我将上面的代码重构为以下结构,以便重用序列生成器:
let seqOfLength lengthInterval generator =
gen {
let! length …Run Code Online (Sandbox Code Playgroud) 我正在使用pholser的端口.我必须生成匹配给定模式的字符串\[a-zA-Z0-9\\.\\-\\\\;\\:\\_\\@\\[\\]\\^/\\|\\}\\{]* Length 40.
我将Generator类扩展为:
public class InputGenerator extends Generator<TestData> {...}
Run Code Online (Sandbox Code Playgroud)
它重载了一个函数:
publicTestData generate(SourceOfRandomness random, GenerationStatus status) {...}
Run Code Online (Sandbox Code Playgroud)
现在,random有像nextDouble(),nextInt()这样的函数,但没有字符串!如何生成与上述模式匹配的随机字符串?
我想在我的库中对各种类型进行一些类似的测试.
为简化起见,假设我有许多实现Num类的向量类型,并且我想生成相同的QuickCheck属性检查prop_absNorm x y = abs x + abs y >= abs (x+y),该检查可以对库中的所有类型起作用.
我使用TH生成这样的属性:
$(writeTests
(\t ->
[d| prop_absNorm :: $(t) -> $(t) -> Bool
prop_absNorm x y = abs x + abs y >= abs (x+y)
|])
)
Run Code Online (Sandbox Code Playgroud)
我生成测试的函数具有以下签名:
writeTests :: (TypeQ -> Q [Dec]) -> Q [Dec]
Run Code Online (Sandbox Code Playgroud)
此函数查找我的矢量类的所有实例VectorMath (n::Nat) t(以及同时的实例Num)reify ''VectorMath并相应地生成所有prop函数.
-ddump-splices显示这样的事情:
prop_absNormIntX4 :: Vector 4 Int -> Vector 4 Int -> Bool
prop_absNormIntX4 x y = …Run Code Online (Sandbox Code Playgroud) 我试图解决与"第一原理的Haskell编程"第15章中的另一个问题相同的练习.我已经创建了一个Semigroup实例,而且我在编写QuickCheck部分练习时遇到了麻烦.
Semigroup实例应该满足:
a <> (b <> c) == (a <> b) <> c
Run Code Online (Sandbox Code Playgroud)
<>Semigroup mappend 在哪里.
我想出了以下内容:
import Data.Semigroup
import Test.QuickCheck
semigroupAssoc :: (Eq m, Semigroup m) => m -> m -> m -> Bool
semigroupAssoc a b c = (a <> (b <> c)) == ((a <> b) <> c)
newtype Combine a b = Combine { unCombine :: (a -> b) }
instance Semigroup b => Semigroup (Combine a b) where
(Combine f) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Haskell Book(第15章,"Monoid,Semigroup")中进行Monoid练习之一,但我被卡住了.给出以下内容:
newtype Combine a b =
Combine { unCombine :: (a -> b) }
Run Code Online (Sandbox Code Playgroud)
我应该Monoid为Combine 编写实例.
我写了这样的东西:
instance (Semigroup b) => Semigroup (Combine a b) where
Combine { unCombine = f } <> Combine { unCombine = g } =
Combine { unCombine = \x -> f x <> g x }
instance (Monoid b) => Monoid (Combine a b) where
mempty = Combine { unCombine = \_ -> mempty }
mappend = (<>)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何quickCheck为实例编写. …