Piszę Vector
i Matrix
typów danych, które są zależnie wpisane.Testy QuickCheck dla typów zależnych
data Vector n e where
EmptyVector :: Vector Zero e
(:>) :: e -> Vector n e -> Vector (Succ n) e
deriving instance Eq e => Eq (Vector n e)
infixr :>
data Matrix r c e where
EmptyMatrix :: Matrix Zero c e
(:/) :: Vector c e -> Matrix r c e -> Matrix (Succ r) c e
deriving instance Eq e => Eq (Matrix r c e)
infixr :/
Są zależne od liczb naturalnych, również typu.
data Natural where
Zero :: Natural
Succ :: Natural -> Natural
Napisałem funkcję do obliczania liczby kolumn w macierzy.
columns :: Matrix r c e -> Int
columns m = Fold.foldr (\_ n -> 1 + n) 0 $ getRow 0 m
getRow :: Int -> Matrix r c e -> Vector c e
getRow 0 (v :/ _) = v
getRow i (_ :/ m) = getRow (i - 1) m
getRow _ EmptyMatrix = error "Cannot getRow from EmptyMatrix."
Chciałbym teraz chcesz przetestować funkcję columns
użyciu QuickCheck.
Aby to zrobić, muszę zadeklarować Matrix
i Vector
jako wystąpienia klasy typu Arbitrary
dostarczone przez QuickCheck.
Jednak nie mam pojęcia, jak to zrobić.
Czy fakt, że moje dane są zależnie wpisane wpływa na to, w jaki sposób piszę te wystąpienia?
Jak wygenerować macierze o dowolnej długości, upewniając się, że pasują do ich definicji (np. (Succ (Succ r)) będą miały dwa wiersze)?
Dziękujemy! To było bardzo pomocne. – sdasdadas