2

私は実世界の Haskellに取り組んでいます。第 4 章の演習の 1 つは、foldrベース バージョンの を実装することですconcat。私の結果を検証するための既存の実装があるため、これは QuickCheck を使用したテストの優れた候補になると思いました。Arbitraryただし、これには、任意のを生成できる型クラスのインスタンスを定義する必要があります [[Int]]。これまでのところ、これを行う方法を理解できませんでした。私の最初の試みは:

module FoldExcercises_Test
where

import Test.QuickCheck
import Test.QuickCheck.Batch

import FoldExcercises

prop_concat xs = 
    concat xs == fconcat xs
    where types = xs ::[[Int]]


options = TestOptions { no_of_tests = 200
                      , length_of_tests = 1
                      , debug_tests = True }

allChecks = [ 
              run (prop_concat)
            ]

main = do
  runTests "simple" options allChecks

これにより、テストは実行されません。さまざまな断片を見て、Arbitraryインスタンス宣言が必要であると推測し、追加しました

    instance Arbitrary a => Arbitrary [[a]] where
    arbitrary = sized arb' 
        where arb' n = vector n (arbitrary :: Gen a)

これにより、インスタンス宣言が無効であり、 -XFlexibleInstances を追加すると問題が解決する可能性があると ghci が不平を言うようになりました。{-# OPTIONS_GHC -XFlexibleInstances #-}ディレクティブを追加すると、タイプの不一致と重複インスタンスの警告が発生します。

だから私の質問は、これを機能させるために何が必要ですか? 私は明らかに Haskell の初心者であり、私を助けるリソースが見つかりません。どんなポインタでも大歓迎です。

編集

fconcatテストで最初の方法が次のように定義されて いる場合、QuickCheckの出力に誤解されたようです

fconcat = undefined  

実際に関数を正しく実装すると、実際に期待される結果が得られます。ドゥープ

4

1 に答える 1

3

[[Int]]はすでにArbitraryインスタンスです (IntArbitraryインスタンスであるため、それ自体が のインスタンスである[a]すべての も同様です)。それは問題ではありません。aArbitrary

私はあなたのコードを自分で実行し ( に置き換えimport FoldExcercisesfconcat = concat)、予想どおり 200 のテストを実行しました。Arbitraryただし、インスタンスを追加する必要はありません。

于 2009-11-06T23:24:14.620 に答える