2010-12-06 20 views
2

Salut j'ai le code suivantvariable Fonction non compris dans 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) 

Mais je reçois « pas dans la portée "générer", pourquoi est-ce donc?

Cordialement Darren

Modifier J'importent Test.QuickCheck mais il reste des plaintes à propos de la "générer" n'est pas dans la portée

Modifier 2

Comment écrire cette fonction pour qu'elle fonctionne avec quickcheck version 2? Je simplement essayé de mettre « Ungen » où était sans générer succsess, je quickcheck également installé v 2 (cabale installer QuickCheck-2.1.0.3)

je besoin d'une fonction avec des propriétés suivantes stdGen->Gen Expr->Expr' et Ungen semblent me donner ce fonctionnalité, mais comme je l'ai dit, mon compilateur ne peut pas trouver cette fonction. Y a-t-il d'autres fonctions que je pourrais utiliser pour ce problème?

+0

Votre modification fournit toujours des informations incomplètes. Quelle version de quickcheck utilisez-vous? QuickCheck2 n'exporte pas 'generate' afaik. Votre extrait de code fonctionne avec QC1 à condition de corriger les flèches Unicode (ne le faites pas) et d'ajouter 'type Expr = Int'. –

+0

Ne sais pas comment vous vérifiez quelle version im en utilisant, mais je suppose que im en utilisant la version 1, et donc je veux utiliser la fonction "générer" dans quickcheck. Mais si je change ma question, y a-t-il un autre moyen d'écrire cette fonction? – Darren

Répondre

1

generate n'est pas une fonction de System.Random. Vous recherchez peut-être next? Permettez-moi d'être clair: je ne sais pas pourquoi vous utilisez QuickCheck/Arbitrary pour une tâche qui semble plus adaptée à Random/MonadRandom. Je suppose que vous avez examiné vos options et passer à autre chose.

Faut-il choisir son générateur? Tu ne peux pas utiliser sample' :: Gen a -> IO a?

getVal :: IO a 
getVal = sample' arbitrary 

Ceci devrait fonctionner pour QC2.

OTOH, si vous voulez vraiment utiliser votre propre StdGen (ou si vous voulez éviter IO) puis essayez:

import System.Random 
import Test.QuickCheck 
import Test.QuickCheck.Gen 

func :: StdGen -> Int 
func g = unGen arbitrary g 0 

Cela utilisera le StdGen nommé g et un comte (0 ici) pour générer votre valeur. Parce que unGen ne marche pas le générateur, et que le compteur ne donne pas de bonnes propriétés aléatoires (il semble que vous pouvez essayer et voir par vous-même), vous pourriez vouloir envelopper avec quelque chose qui génère StdGen s (beurk).

Si vous ne savez pas ce package version que vous utilisez, puis exécutez:

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

Dans ma configuration (voir ci-dessus), j'ai à la fois 1 et 2, mais 2 est caché (le () signifie caché) donc quand j'utilise GHCi et que j'importe Test.QuickCheck c'est la version 1 que je reçois.

+0

Merci les gars que vous avez résolu mon problème :) – Darren

+0

Vous cliquez généralement sur la coche à côté de la réponse acceptable. Certaines personnes ici sont méchantes et ne répondront pas à vos questions si elles voient que vous en avez demandé trop sans l'accepter. –

1

Il semble que vous utilisiez des générateurs de Test.QuickCheck, et generate est une fonction de la version 1 de quickCheck. Dans la version 2 de quickCheck, les choses sont un peu différentes, donc il n'y a pas de telle fonction. Cependant, vous devez atleast importer Test.QuickCheck et des fonctionnalités similaires peuvent être obtenus à partir unGen comme ceci:

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

S'il vous plaît noter que unGen est en Test.QuickCheck.Gen donc vous devez importer aussi.