我在Haskell中创建了一个Matrix模块,我想使用QuickCheck来测试我的代码的一些属性。具体而言,我想生成具有相关逆的随机矩阵。以下是我创建一个生成这种矩阵的QuickCheck生成器的尝试。使用QuickCheck测试Haskell矩阵
invertibleMatrix :: (Num a, Arbitrary a) => Gen (Matrix a)
invertibleMatrix = do s <- choose (2,10)
a <- vectorOf s (vector s)
if (det (Matrix a) == 0) then
invertibleMatrix
else
return (Matrix a)
的代码首先创建2和10中,然后这个尺寸的向量的向量之间的尺寸。如果行列式为零,那么矩阵不是可逆的,所以我递归地调用invertibleMatrix。否则,我返回新的矩阵。
问题是,当我把它放在一个属性中进行测试时,这段代码不会终止。 (我认为它不断创建同样的零元素矩阵,它显然不具有逆元素,因此它会进入无限循环)。我究竟做错了什么?我该如何解决?谢谢。
马克
还有其他人有什么建议吗? – Mark 2012-04-27 08:32:47
'vectorOf'的定义是什么样的? – 2012-04-27 15:11:30
'vectorOf :: Int - > Gen a - > Gen [a]'并且在QuickCheck中定义。 – Mark 2012-04-28 02:46:13