私はHaskellで行列モジュールを作成していますが、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
'vectorOf'の定義はどのようになっていますか? –
'vectorOf :: Int - > Gen a - > Gen [a]'であり、QuickCheck自体で定義されています。 – Mark