2017-02-12 8 views
0

でシャッフルしてテストデータを生成する方法を、私は2つの段階でテストデータを生成する:nはランダムな正の整数で与えられたリスト[1..nの]については、QuickCeck

  1. シャッフルリスト、xs =シャッフル[1..n];
  2. xsからyに番号xをランダムに変更します。1 < = y < = n;

この2つのステップの後で、新しいリストはysと表示されます。

私はプログラムを作成しました。これは、関数のプロトタイプは次のようである、YS、および出力(x、y)をとります。

solve :: [a] -> (a, a) 

私は私のプログラムをテストするためにTest.QuickCheckを使用したいです。どのようにそのようなテストデータを生成するのですか? QuickCheckに機能があることがわかります

shuffle :: [a] -> Gen [a] 

しかし、私はどのように使用するかについてはわかりません。

答えて

2

QuickCheckのGenモナドは、基本的に、状態として乱数ジェネレータを持つ状態モナドです。だから、この引数はリストを取り、Genモナド「の」シャッフルリストを返すことを意味

shuffle :: [a] -> Gen [a] 

を見たとき。

そのモナドはdo句の中に入れることができるので、そのないあなたが求めているが、私はこのようなその何か考えるものをかなり明確:あなたはgenerateを使用してゲンモナドでアクションを実行することができます

myTest :: Integer -> Gen [Integer] 
myTest 0 = return [] 
myTest n = do 
    ns <- shuffle [1..n] 
    x <- choose (0,n-1) 
    y <- choose (1,n) 
    let (ns1,ns2) = splitAt x ns 
    return $ ns1 ++ [y] ++ drop 1 ns2` 

IOに値を返すか、設定することができますテストデータのための新しいタイプと

arbitrary :: Gen a 

編集機能が含まれている、それArbitraryのインスタンスを作る:

かのようにゼータは、あなたが forAllを使用することができ、コメントで指摘
quickCheck $ forAll (myTest 10) $ \x -> .... 
+0

ありがとうございました。サンプルデータ型を作成し、任意の関数を提供しました。 https://github.com/liuxinyu95/AlgoXY/blob/algoxy/others/problems/miss-dup/MissDup.hs –

+0

または、あなたは 'quickCheck $ forAll(myTest 10)$ \ x - >を使っています。 '。 – Zeta

関連する問題