您好我有以下代码
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”放在哪里生成没有succsess,我还安装了quickcheck v 2(cabal安装QuickCheck-2.1.0.3)
我需要一个具有以下属性stdGen->Gen Expr->Expr'
的函数
并且unGen似乎给了我这个功能,但正如我所说,我的编译器无法找到该功能。我可以使用其他任何功能来解决这个问题吗?
答案 0 :(得分: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
的{{1}}和此处的计数(g
)来生成您的值。因为unGen不会执行生成器,并且计数器步进不会提供良好的随机性属性(看起来,您可以尝试自己查看),您最终可能希望用生成0
s的内容包装它(呸)。
如果您不知道正在使用的版本包,请运行:
StdGen
在我的设置中(见上文)我同时拥有1和2,但隐藏了2($ ghc-pkg list | grep QuickCheck
(QuickCheck-2.1.1.1)
QuickCheck-1.2.0.1
意味着隐藏)所以当我使用GHCi并导入()
时,我得到的是版本1。
答案 1 :(得分:1)
看起来你正在使用Test.QuickCheck中的生成器,而generate是一个来自quickCheck版本1的函数。在quickCheck的第2版中,事情有点不同,所以没有这样的功能。但是,您至少需要导入Test.QuickCheck,类似的功能可以从unGen
获得,如下所示:
rundExpr gen = fmap (flip (unGen gen) 5) newStdGen
请注意,unGen
位于Test.QuickCheck.Gen中,因此您也必须导入。