我正在 Haskell 中创建一个 Matrix 模块,我想使用 QuickCheck 来测试我的代码的一些属性。具体来说,我想生成具有关联逆的随机矩阵。以下是我尝试创建生成此类矩阵的 QuickCheck 生成器。
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。否则我返回新矩阵。
问题是,当我把它放在一个属性中进行测试时,这段代码并没有终止。(我认为它不断创建相同的 sxs 零元素矩阵,显然没有逆矩阵,因此它进入了无限循环)。我究竟做错了什么?我该如何解决?谢谢。
标记