作为一个学习练习,我想写一个Data.MeldableHeap
的生成器。我在之后将其图案化:
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)
请提供指导。
更新:在我的帮助下,我明白了:
实际测试可能会更好,但重点是学习在一个非平凡的例子中使用QuickCheck。谢谢,H
答案 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验证)