2

こんにちは、私は次のコードを持っています

import Data.Maybe
import Test.QuickCheck
import System.Random


rndExpr :: Gen Expr ->  IO Expr
rndExpr gen = do
    rnd <-  newStdGen
    return (generate 5 rnd gen)

しかし、「生成範囲外」と表示されるのはなぜですか?

よろしくダレン

編集私は Test.QuickCheck をインポートしていますが、「生成」が範囲外であるという苦情はまだあります。

編集 2

この関数を quickcheck バージョン 2 で動作させるには、どのように記述しますか? 生成が成功しなかった場所に「unGen」を配置しようとしただけで、quickcheck v 2もインストールしました(cabal install QuickCheck-2.1.0.3)

次のプロパティstdGen->Gen Expr->Expr' を持つ関数が必要であり、unGen はその機能を提供しているようですが、前述のように、コンパイラはその関数を見つけることができません。この問題に使用できる他の関数はありますか?

4

2 に答える 2

1

generateの関数ではありませんSystem.Random。おそらくあなたは探していnextますか?

編集: はっきりさせてください: Random/MonadRandom がより適していると思われるタスクに QuickCheck/Arbitrary を使用している理由がわかりません。あなたが選択肢を検討して先に進むと仮定します。

発電機を選択する必要がありますか? 使えませんsample' :: Gen a -> IO aか?

getVal :: IO a
getVal = sample' arbitrary

これは QC2 で機能するはずです。

OTOH、本当に独自のものを使用しStdGenたい (または IO を避けたい) 場合は、次を試してください。

import System.Random
import Test.QuickCheck
import Test.QuickCheck.Gen

func :: StdGen -> Int
func g = unGen arbitrary g 0

これは、StdGen名前付きgとカウント (0ここでは) を使用して値を生成します。unGen はジェネレーターをステッピングせず、カウンターステッピングは適切なランダム性プロパティを提供しないため (自分で試してみるとよいようです)、これをStdGens を生成するものでラップしたくなるかもしれません (yuck)。

使用しているパッケージのバージョンがわからない場合は、次を実行します。

$ ghc-pkg list | grep QuickCheck
(QuickCheck-2.1.1.1)
QuickCheck-1.2.0.1

私のセットアップ (上記参照) には 1 と 2 の両方がありますが、2 は非表示 (()手段が非表示) であるため、GHCi を使用してインポートTest.QuickCheckするとバージョン 1 が取得されます。

于 2010-12-06T20:10:05.010 に答える
1

Test.QuickCheck のジェネレーターを使用しているようで、generate は quickCheck のバージョン 1 の関数です。バージョン 2 の quickCheck では状況が少し異なり、そのような機能はありません。ただし、少なくとも Test.QuickCheck をインポートする必要があり、同様の機能を次のように取得できますunGen

rundExpr gen = fmap (flip (unGen gen) 5) newStdGen

unGenTest.QuickCheck.Gen にあるので、それもインポートする必要があることに注意してください。

于 2010-12-06T20:21:25.847 に答える