我正在尝试使用SmallCheck来测试Haskell程序,但我无法理解如何使用该库来测试我自己的数据类型.显然,我需要使用Test.SmallCheck.Series.但是,我发现它的文档非常混乱.我对菜谱式解决方案和逻辑(monadic?)结构的可理解解释感兴趣.以下是我的一些问题(全部相关):
如果我有数据类型data Person = SnowWhite | Dwarf Integer,我smallCheck该如何解释有效值是Dwarf 1通过Dwarf 7(或SnowWhite)?如果我有一个复杂的FairyTale数据结构和构造函数makeTale :: [Person] -> FairyTale,并且我想smallCheck使用构造函数从Person-s列表中制作FairyTale-s怎么办?
我设法quickCheck通过使用Control.Monad.liftM类似功能的明智应用程序来完成这样的工作,而不会让 我的手太脏makeTale.我无法想办法解决这个问题smallCheck(请向我解释一下!).
什么是类型之间的关系Serial,Series等等?
(可选)有什么意义coSeries?我如何使用Positive来自的类型SmallCheck.Series?
(可选)在smallCheck的上下文中,任何阐明应该是monadic表达式的逻辑是什么,以及什么只是常规函数,将会受到赞赏.
如果有任何介绍/教程使用smallCheck,我会很感激一个链接.非常感谢你!
更新:我应该补充一点,我找到的最有用和可读的文档smallCheck是本文(PDF).第一眼看我在那里找不到我的问题的答案; 它更像是一个有说服力的广告而不是教程.
更新2:我把关于Identity在类型Test.SmallCheck.list和其他地方出现的怪异问题转移到一个单独的问题上.
使用此片段和smallcheck-1.0.1
data Foo = A | B | Pair Foo Foo deriving Show
deriving instance Generic Foo
instance (Monad m) => Serial m Foo
Run Code Online (Sandbox Code Playgroud)
那么这个
list 1 (series :: Series Identity Foo)
Run Code Online (Sandbox Code Playgroud)
生成一个看似无限的列表.
我认为有些东西是相同的,直到smallcheck-0.6.1只生成[A,B]并且是我所期望的.
这是对smallcheck系列的预期更改,如果是这样,是否有一种简单的方法来取回0.6.1行为.
这里有可编辑的程序来证明这一点:http: //hpaste.org/83927
我有两种在Python中查找素数的算法.每个的内循环似乎执行相同的次数,并且同样简单.但是,其中一个需要10倍于另一个.我的问题是:
为什么?这是一些可以优化掉的Python的怪癖(如何?),还是我错过了其他的东西?
我要解决的问题主要来自http://www.spoj.pl/problems/PRIME1/.在我的情况下,我有N = 10**9,delta = 10**5,我想找到N-delta和delta之间的所有素数.我还有smallprimes一个预先制作的所有素数小于或等于N的平方根的列表.第一个算法非常简单:
def range_f1(lo, hi, smallprimes):
"""Finds all primes p with lo <= p <= hi.
smallprimes is the sorted list of all primes up to (at least) square root of hi.
hi & lo might be large, but hi-lo+1 miust fit into a long."""
primes =[]
for i in xrange(hi-lo+1):
n = lo + i
isprime = True
for p in smallprimes:
if n % p == 0:
isprime = …Run Code Online (Sandbox Code Playgroud) haskell ×2
smallcheck ×2
algorithm ×1
monads ×1
optimization ×1
primes ×1
profiling ×1
python ×1
testing ×1