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 사이의 크기를 만들고이 크기의 벡터 벡터를 만듭니다. 행렬식이 0이라면 행렬은 역전이 아니므로 invertibleMatrix를 재귀 적으로 호출합니다. 그렇지 않으면 새 행렬을 반환합니다.
문제는이 코드를 테스트 할 속성에 넣을 때 종료되지 않는다는 것입니다. (나는 그것이 항상 역원을 가지지 않는 제로 요소의 같은 s x 행렬을 끊임없이 생성한다고 생각하여 무한 루프로 간다.) 내가 도대체 뭘 잘못하고있는 겁니까? 이 문제를 어떻게 해결할 수 있습니까? 감사.
마크
그 밖의 제안 사항이 있습니까? – Mark
'vectorOf'의 정의는 어떻게 생겼습니까? –
'vectorOf :: Int -> Gen a -> Gen [a]'이며 QuickCheck 자체에서 정의됩니다. – Mark