【发布时间】:2014-06-07 04:46:58
【问题描述】:
我正在编写依赖类型的Vector 和Matrix 数据类型。
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 :/
它们取决于自然数,也是一种类型。
data Natural where
Zero :: Natural
Succ :: Natural -> Natural
我写了一个函数来计算矩阵的列数。
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."
我现在想使用 QuickCheck 测试 columns 函数。
为此,我必须将Matrix 和Vector 声明为QuickCheck 提供的Arbitrary 类型类的实例。
但是,我不知道该怎么做。
我的数据是依赖类型的这一事实是否会影响我编写这些实例的方式?
如何生成任意长度的矩阵,确保它们与定义匹配(例如,(Succ (Succ r)) 将有两行)?
【问题讨论】:
标签: haskell quickcheck