我有一个从Network.HTTP获取ResponseCode的函数.为了使用QuickCheck进行测试,我想为ResponseCode编写一个Arbitrary实例.(如果您不知道,ResponseCode只是该库中的三个整数:类型ResponseCode =(Int,Int,Int)).
所以我写了这样的东西:
instance Arbitrary ResponseCode where
arbitrary = triple ( elements [1..6] )
where triple f = (f, f, f)
Run Code Online (Sandbox Code Playgroud)
首先,GHC抱怨我使用类型的方式不是标准的haskell所以我必须使用一些编译器标志(这不是我想要的,因为我觉得必须有一个简单的解决方案来解决这个简单的问题标志).
其次,我的任意函数都有错误的类型,这很明显.但后来我真的不知道如何编写一个函数,返回一个三元组,随机的Ints从1-6开始.
如果有人能帮助我,我将不胜感激.
谢谢.
我有以下,
type Pos = (Int, Int)
Run Code Online (Sandbox Code Playgroud)
我想生成这种类型的随机值,但有一些限制(两者都必须是0-8)
我想做点什么
instance Arbitrary Pos where
arbitrary = do x <- choose(0,8)
y <- choose(0,8)
return (x,y)
Run Code Online (Sandbox Code Playgroud)
然后在我的测试中使用它来获得有效的职位.
这不会起作用bc我是别名(?)元组
我试过的其他方法是在我的测试中使用含义来说
prop_my_prop (x,y) = abs x < 9 && abs y < 9 ==> ...
Run Code Online (Sandbox Code Playgroud)
但我认为这很丑陋,理论上它可能会耗尽快速检查(运行超过1000次).
这是一项任务,所以我只想要一些指示来看待或如何处理这个,我不允许改变Pos.
testing haskell functional-programming functional-testing quickcheck
我有一个函数arbExample来生成一个随机Example数据类型,它取决于许多函数.
我试图通过做一些属性测试quickCheck prop_example,问题是我不知道如何定义一个Arbitrary实例Example使用arbExample.
我喜欢quickCheck prop_example在指定使用的Gens数据结构时运行arbExample.
data Example = Example
{ myInt :: Int
, myList :: [String]
} deriving (Show)
data Gens = Gens
{ gen1 :: Gen Int
, gen2 :: Gen String }
arbExample :: Gens -> Gen Example
arbExample gens = do
i <- gen1 gens
xs <- vectorOf i (gen2 gens)
return Example{myInt=i, myList=xs}
prop_example :: Example -> …Run Code Online (Sandbox Code Playgroud) 有这个代码来测试:
-- | this function checks if string or list are a palindrome
isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome x =
if reverse x == x
then True
else False
Run Code Online (Sandbox Code Playgroud)
我设法写了这个:
-- | how do I remove ugly parentheses our of here?
palindromeTest verb = isPalindrome ((\verb -> verb ++ reverse verb) verb ) == True
where types = verb::String
Run Code Online (Sandbox Code Playgroud)
括号看起来很恶心,我该如何解决?