haskell – QuickCheck测试依赖类型
发布时间:2020-12-14 04:57:33 所属栏目:百科 来源:网络整理
导读:我正在编写依赖类型的Vector和Matrix数据类型. data Vector n e where EmptyVector :: Vector Zero e (:) :: e - Vector n e - Vector (Succ n) ederiving instance Eq e = Eq (Vector n e)infixr :data Matrix r c e where EmptyMatrix :: Matrix Zero c e
我正在编写依赖类型的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测试列函数. 为此,我必须将Matrix和Vector声明为QuickCheck提供的Arbitrary类型类的实例. 但是,我不知道如何做到这一点. >我的数据是否依赖于类型的事实会影响我如何编写这些实例? 解决方法
您可以编写在编译时已知的特定长度的实例:
instance Arbitrary (Vector Zero e) where arbitrary = return EmptyVector instance (Arbitrary e,Arbitrary (Vector n e)) => Arbitrary (Vector (Succ n) e) where arbitrary = do e <- arbitrary es <- arbitrary return (e :> es) 除非你想写,否则上述实例本身并不是很有用 data BoxM e where BoxM :: Arbitrary (Vector c e) => Matrix r c e -> BoxM e data Box e where Box :: Arbitrary (Vector c e) => Vector c e -> Box e addRow :: Gen e -> BoxM e -> Gen (BoxM e) addRow mkE (BoxM es) = do e <- mkE return $BoxM (e :/ es) firstRow :: Arbitrary a => [a] -> BoxM a firstRow es = case foldr (e (Box es) -> Box (e :> es)) (Box EmptyVector) es of Box v -> BoxM (v :/ EmptyMatrix) 使用addRow和firstRow,编写一个非常简单 forAll (choose (0,3)) $n -> forAll (choose (0,3)) $m -> do BoxM matrix <- mkBoxM n m return $columns matrix == m -- or whatever actually makes sense (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – ActiveRecord模型的无限任意属性(键/值对
- objective-c – 旧版iOS和OS X上的ARC
- flex_SkinnableContainer容器使用示例;
- vb6 – 访问ADO记录集中字段值的最有效方法是什么?
- server.xml修改后,tomcat访问不到服务器
- PostgreSQL 创建帐号,数据库,权限,备份,恢复
- iphone – rootViewController在故事板中设置,在App Launch
- 将JSONObject转换为Java对象
- PostgreSQL 多个数组聚合为一维数组加速(array_agg)
- ruby-on-rails – 虚拟属性和批量分配