Переменная функции не входит в область действия Haskell - PullRequest
2 голосов
/ 06 декабря 2010

Привет, у меня есть следующий код

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, но он по-прежнему жалуется на «генерирование». Область действия

Edit 2

Как бы вы написали эту функцию, чтобы она работала с quickcheck версии 2? Iпросто попытался поместить "unGen" туда, где генерировать без успеха, я также установил quickcheck v 2 (cabal install QuickCheck-2.1.0.3)

Мне нужна функция со следующими свойствами stdGen->Gen Expr->Expr' и unGen, кажется, даетя эту функциональность, но, как я уже сказал, мой компилятор не может найти эту функцию. Есть ли другие функции, которые я мог бы использовать для этой проблемы?

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Похоже, вы используете генераторы из Test.QuickCheck, а generate - это функция из версии 1 quickCheck. Во второй версии quickCheck все немного по-другому, поэтому такой функции нет. Однако вам по крайней мере необходимо импортировать Test.QuickCheck, и аналогичные функциональные возможности можно получить из unGen, например:

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

Обратите внимание, что unGen находится в Test.QuickCheck.Gen, поэтому вы должны импортировать его тоже.

1 голос
/ 06 декабря 2010

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 не шагает по генератору, а пошаговый счетчик не дает хороших свойств случайности (кажется, вы можете попробовать и убедиться сами), вам может понадобиться обернуть это чем-то, что генерирует StdGen s (гадость).

Если вы не знаете, какой пакет версий вы используете, запустите:

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

В моей настройке (см. Выше) у меня есть 1 и 2, но 2 скрыто(() означает скрытый), поэтому, когда я использую GHCi и импортирую Test.QuickCheck, я получаю версию 1.

...