说我想为(!!)
函数编写一些单元测试。
my_prop xs n = ...
我想将n限制为仅有效索引,我知道我可以做类似
的操作my_prop xs n = (not.null) (drop n xs) ==> ...
但这使得绝大多数生成的案例无效并被抛弃。有没有办法设置,以便QuickCheck首先生成xs
列表并使用其值仅生成n
的有效案例?
答案 0 :(得分:5)
正如Daniel Wagner所建议的,一种可能性是创建我自己的数据类型并为其提供Arbitrary
实例。
data ListAndIndex a = ListAndIndex [a] Int deriving (Show)
instance Arbitrary a => Arbitrary (ListAndIndex a) where
arbitrary = do
(NonEmpty xs) <- arbitrary
n <- elements [0..(length xs - 1)]
return $ ListAndIndex xs n
NonEmpty
来自Test.QuickCheck.Modifiers
中的自定义类型,用于生成非空列表。