函数变量不在Haskell范围内

时间:2010-12-06 20:07:47

标签: haskell random ghci

您好我有以下代码

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似乎给了我这个功能,但正如我所说,我的编译器无法找到该功能。我可以使用其他任何功能来解决这个问题吗?

2 个答案:

答案 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中,因此您也必须导入。