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

It seems like you are using generators from Test.QuickCheck, and generate is a function from version 1 of quickCheck. In version 2 of quickCheck things are a bit different so there is no such function. However, you atleast need to import Test.QuickCheck, and similar functionality can be gotten from unGen like this:

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

Please note that unGen is in Test.QuickCheck.Gen so you have to import that too.

于 2010-12-06T20:21:25.847 回答
1

generate不是System.Random. 也许您正在寻找next

编辑:让我明确一点:我不知道您为什么将 QuickCheck/Arbitrary 用于 Random/MonadRandom 似乎更合适的任务。我假设您考虑了您的选择并继续前进。

你必须选择你的发电机吗?你不能用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 的东西(恶心)来包装它。

如果你不知道你使用的是什么版本的包,那么运行:

$ 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 回答