2010-12-06 4 views
2

こんにちは、私は次のコード関数の変数ではないHaskellの

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

クイックチェックバージョン2で動作するように、この関数をどのように記述しますか?私はシンプルなノーsuccsessとした生成「Ungenメール」を入れてみました、私もインストールquickcheckのV 2

私は次のプロパティstdGen->Gen Expr->Expr' とUngenメールでの機能を必要とすることを私に与えているように見える(徒党はQuickCheck-2.1.0.3をインストール)私の言ったように、コンパイラはその機能を見つけることができません。この問題に使用できる他の機能はありますか?

+0

あなたの編集ではまだ不完全な情報が得られます。クイックチェックのどのバージョンを使用していますか? QuickCheck2はafaikを 'generate'にエクスポートしません。あなたのコードスニペットはQC1で見つけることができます。私はunicodeの矢印を修正しました。(しないでください) 'type Expr = Int'を追加してください。 –

+0

どのバージョンを使用しているかを確認する方法はわかりませんが、imはバージョン1を使用していると仮定しているため、quickcheckで "generate"関数を使用します。しかし、私の質問が変わった場合、この機能を書くための他の方法はありますか? – Darren

答えて

1

generateは、System.Randomの機能ではありません。おそらく、あなたはnextをお探しですか?

EDIT: 私は、ランダム/モナドランダムがよりフィットしていると思われるタスクに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 

これはあなたを生成するg、カウント(ここでは0、)という名前のStdGenを使用します。値。 unGenはジェネレータにステップを踏み込まないので、カウンターステッピングが良いランダム性プロパティを与えないので(あなた自身で試して見ることができます)、StdGen(yuck)を生成するものでこれをラップしたいかもしれません。あなたが実行し使用しているバージョンのパッケージがわからない場合

:私は両方の1と2が、2隠されているを持っている(上で見た)私の設定では

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

を(()は隠された意味します) GHCiを使用してTest.QuickCheckをインポートすると、バージョン1になります。

+0

おかげであなたは私の問題を解決しました:) – Darren

+0

あなたは通常、受け入れ可能な答えの隣にあるチェックマークをクリックします。あなたが受け入れることなくあまりにも多くの人に尋ねてきたのを見たら、あなたの質問に答えないでしょう。 –

1

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

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

してください。