ハマールの答えは問題に完全に適しています。しかし、質問された正確な質問に答えるために、私はちょっと調べることができませんでした。 forAll
を使用しましょう。
prop_bang x = x >= 0 ==> forAll (listLongerThan x) $ \xs ->
element_at xs x == xs !! x
ここで関数listLongerThan :: Int -> Gen [Int]
が必要です。長さxをとり、x
より大きい長さのリストを生成するジェネレータを生成します。
listLongerThan :: Int -> Gen [Int]
listLongerThan x = replicateM (x+1) arbitrary
わかりやすく、Gen
のMonadインスタンスを利用しています。 quickCheck prop_bang
を実行すると、不合理に長いリストのテストが始まるので、かなり長い時間がかかり始めることに気付くでしょう。リストの長さを制限して、少し速くしましょう。また、今すぐlistLongerThan
は、ちょうどx+1
の長さのリストを生成します。さんが再びあなたはそれが正しいものを生成していることを確認するGHCiの中sample smallNumber
またはsample (listLongerThan 3)
を使用することができ将軍
prop_bang =
forAll smallNumber $ \x ->
forAll (listLongerThan x) $ \xs ->
element_at xs x == xs !! x
smallNumber :: Gen Int
smallNumber = fmap ((`mod` 100) . abs) arbitrary
listLongerThan :: Int -> Gen [Int]
listLongerThan x = do
y <- fmap (+1) smallNumber -- y > 0
replicateM (x+y) arbitrary
のモナドのインスタンスを利用し、少しそれをミックスしてみましょう。
これは完全に機能するようですが、理解するためにコードをさらに検討する必要があります。 :) –
グーグル以外、どのようなパッケージがNonEmptyを提供しているかを知るにはどうすればいいですか? –
@JoeVanDyk:[QuickCheckから](http://hackage.haskell.org/packages/archive/QuickCheck/2.4.1.1/doc/html/Test-QuickCheck.html#t:NonEmptyList)です。 – hammar