1

学習課題として、 のジェネレーターを書きたいと思い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

4

1 に答える 1

2

違いは、あなたが見ているコードには、型クラスがあることです

class PriorityQueue pq where
  insert ...

さまざまな優先度のキューに対する一連の操作があります。ただし、型クラスはありません。PQプライオリティ キューの 1 つの実装、つまり融合可能なヒープを表す具体的な型であるデータ型があります。

代わりに試す

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 の少数のパッケージの 1 つをテストすることの皮肉についてコメントする必要があります :) (meldable-heap は coq で検証されます)

于 2013-11-07T18:26:19.120 に答える