Je voudrais générer de la valeur arbitraire pour la structure arborescente ordonnée dont le type est, par exemplerestrictions minimales pour générer arbitraire dans la gamme
data Tree a = Leaf | Node (Tree a) a (Tree a)
Une fonction que la valeur insère dans cet arbre tout en gardant ordonné, il faudrait que la valeur devrait être Ord. Mais pour générer des Arbres ordonnés pour une instance arbitraire, je devrais générer une valeur dans la plage "[low, hi]" et Ord est insuffisant pour cela. Donc j'ai aussi demandé que la valeur soit Enum puisque Enum permet d'obtenir des valeurs à partir d'une limite donnée. Le choose
ci-dessous exige également System.Random.Random:
import Test.QuickCheck.Arbitrary
import System.Random
generateTree :: (Arbitrary a, Ord a, Enum a, Random a) => a -> a -> Gen (Tree a)
generateTree l u = do
genLeaf <- arbitrary
if genLeaf
then return Leaf
else do
x <- choose (l, u)
left <- generateTree l (pred x)
right <- generateTree (succ x) u
return $ Node left x right
donc de l'utiliser pour la mise en œuvre arbitrary
je besoin des mêmes classes en classe arbitraire:
instance (Arbitrary a, Ord a, Enum a, Rand.Random a) => Arbitrary (Tree a) where
arbitrary = do
l <- arbitrary
u <- arbitrary
generateTree l u
Ici, tout exigence Ord a => Tree a
suffit structure de données elle-même, j'ai besoin (Arbitrary a, Ord a, Enum a, Rand.Random a) => Tree a
pour son générateur. Cela ressemble à une fuite des détails de mise en œuvre dans la déclaration - probablement que je regarde mal, j'apprends Haskell. Mais il y a encore des questions:
- Existe-t-il un moyen de déclarer un générateur plus générique qui n'a pas autant d'exigences?
- Existe-t-il un moyen de déclarer une autre instance pour
Arbitrary (Tree a)
avec une instance supérieure qui aurait un ensemble d'exigences différent, quelque chose commeArbitrary (Tree Int)
qui serait utilisé uniquement pourInt
?
Vous pouvez générer les arbres par des opérations arbitraires sur l'arbre. Cela nécessite seulement une instance 'Arbitrary' pour' a' et ne nécessite pas l'accès à l'implémentation de ces opérations. – Cirdec