質問

Iラッパー値(Atomic)から/への特定のタイプを変換するための関数を定義型クラスAtomを有します。 「Atomicのすべてのインスタンスのために、任意の値が保存され、安全に取り出すことが可能」:私は述べてQuickCheckプロパティを定義したいと思います。プロパティは次のようになります:

class Atomic a where
    toAtom :: a -> Atom
    fromAtom :: Atom -> Maybe a

prop_AtomIdentity x = fromAtom (toAtom x) == Just x
私はちょうどQuickCheckてそのプロパティを実行しようとした場合、

しかし、それはただ一つのインスタンス(Bool)やテスト、それを選びます。私は現在、テストリストでサポートされている各原子タイプに型シグネチャを定義することによって、その周り働いているが、これは冗長でエラーが発生しやすいます:

containerTests =
    [ run (prop_AtomIdentity :: Bool -> Bool)
    , run (prop_AtomIdentity :: Word8 -> Bool)
    , run (prop_AtomIdentity :: String -> Bool)
    {- etc -} ]

私はこれを自動的に実行する関数を定義しようとしています:

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
    [ run (x :: Bool -> Bool)
    , run (x :: Word8 -> Bool)
    , run (x :: String -> Bool)
    {- etc -} ]

containerTests = forallAtoms prop_AtomIdentity

しかし、それはです。TypeCheckエラーで失敗します:

Tests/Containers.hs:33:0:
    Couldn't match expected type `Word8' against inferred type `String'
    In the first argument of `run', namely `(x :: Word8 -> Bool)'
    In the expression: run (x :: Word8 -> Bool)
    In the expression:
        [run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
         run (x :: String -> Bool)]

複数の種類に対するQCプロパティをテストする良い方法はありますか?そうでない場合、forallAtomsは動作させることができるか、型システムによってサポートされていないこと?

役に立ちましたか?

解決

私はあなたのコードをコンパイルすることはできませんので...ブラインドショットます:

してみてください。

forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]

型シグネチャとして。これは-XRankNTypes言語拡張を必要とします。

私はそれを見るようにあなたは、持っている問題は、GHCはの1 が全体の関数スコープのためax :: (a -> Bool)のために挿入するために入力していますが、すでにそこに別の3を与えるを見つけようとすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top