如何为Data.MeldableHeap优先级队列编写Haskell QuickCheck生成器

时间:2013-11-07 16:05:36

标签: haskell quickcheck

作为一个学习练习,我想写一个Data.MeldableHeap的生成器。我在之后将其图案化:

https://gitorious.org/aocapq/aocapq/source/7f24bb1571b3bd89ada668ea81c37ccdeb825498:src/PriorityQueue/QuickCheck.hs

genericArbitrary :: (PriorityQueue pq, Arbitrary a, Ord a) => Gen (pq a)
genericArbitrary = fromList `fmap` listOf arbitrary

我的代码:

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

import Test.QuickCheck
import Control.Monad (liftM)
import Data.MeldableHeap

genericArbitrary :: (PQ pq, Arbitrary a, Ord a) => Gen (pq a)
genericArbitrary = liftM (foldr (\x acc -> insert x acc) empty) (listOf arbitrary)

但是上面的内容得到了:

`pq' is applied to too many type arguments
In the type signature for `genericArbitrary':
  genericArbitrary :: (PQ pq, Arbitrary a, Ord a) => Gen (pq a)

请提供指导。

更新:在我的帮助下,我明白了:

https://github.com/haroldcarr/learn-haskell-coq-ml-etc/blob/master/haskell/course/coursera-fp-odersky-but-in-haskell/FRP01QuickCheck.hs

实际测试可能会更好,但重点是学习在一个非平凡的例子中使用QuickCheck。谢谢,H

1 个答案:

答案 0 :(得分:2)

不同之处在于,在您查看的代码中,它们具有类型类

class PriorityQueue pq where
  insert ...

对不同的优先级队列进行一系列操作。但是,您没有类型类。您有一个数据类型PQ,它是表示优先级队列的一个实现的具体类型,即可合并堆。

尝试改为

pqArbitrary :: (Arbitrary a, Ord a) => Gen (PQ a)
pqArbitrary = liftM (foldr (\x acc -> insert x acc) empty) (listOf arbitrary)
pqArbitrary' = foldr insert empty `fmap` listOf arbitrary

此外,我必须评论一下讽刺的是测试Hackage上的少数软件包中的一个已被证明是正确的:)(meldable-heap用coq验证)