私は実世界の 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
実際に関数を正しく実装すると、実際に期待される結果が得られます。ドゥープ!