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 行列を常に作成しているため、無限ループに入ると思います)。私は何を間違っていますか?これを修正するにはどうすればよいですか? ありがとう。
マーク