Considérez le problème de génération de chaînes de sorte que, une fois qu'une chaîne est choisie, elle ne puisse plus être répétée. Pour cette tâche, je voudrais utiliser QuickCheck
Gen
fonctions.Génération de chaînes aléatoires à partir d'un pool de chaînes à l'aide de QuickCheck
Si je regarde le type de la fonction que j'essaie d'écrire, cela ressemble beaucoup à une monade d'état. Depuis que j'utilise une autre monade, à savoir Gen
, à l'intérieur de la monade d'état. J'ai écrit ma première tentative en utilisant StateT
.
arbitraryStringS :: StateT GenState Gen String
arbitraryStringS =
mapStateT stringGenS get
où:
newtype GenState = St {getStrings :: [String]}
deriving (Show)
removeString :: String -> GenState -> GenState
removeString str (St xs) = St $ delete str xs
stringGenS :: Gen (a, GenState) -> Gen (String, GenState)
stringGenS genStSt =
genStSt >>= \(_, st) ->
elements (getStrings st) >>= \str ->
return (str, removeString str st)
Quelque chose qui me préoccupe au sujet de cette mise en œuvre est le fait que je ne suis pas en utilisant le premier élément de stringGenS
. Deuxièmement, mon objectif final est de définir un générateur aléatoire pour les valeurs JSON, qui utilisent un pool de ressources (qui ne contient pas seulement des chaînes). L'utilisation StateT
m'a conduit à mettre en œuvre, je me demandais « stateful » variantes de l » elements
QuickCheck
, listOf
, etc.
s'il y a une meilleure façon d'y parvenir, ou une telle complexité est inhérente à la définition des variantes stateful de monades existants.
Je le ferais dans l'autre sens - pour stocker les 'Strings' créées - ou au moins les graines et comparer chaque graine/chaîne générée pour l'appartenance à un' Set' de seeds/'String'. – epsilonhalbe
un autre choix pourrait utiliser uuid pour générer "très probablement" des chaînes uniques, si vous avez seulement un ensemble fini de chaînes - vous finirez par manquer de chaînes, vous pouvez contourner en faisant des combinaisons de grands ensembles de base - mais vous continuerez dans les chaînes dupliquées - si vous avez besoin de "l'unicité réelle" j'irais avec un ensemble de base + un ensemble infini comme les nombres naturels et combiner cela. – epsilonhalbe
Il est important que les chaînes proviennent du pool de ressources. Cela peut être utilisé pour générer des tests en utilisant des données existant dans certaines bases de données. –