Je suis en train de lancer QuickCheck sur certaines listes imbriquées, quelque chose qui ressemble à ceci:
type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]
Si une formule est une liste de littéraux, dont chacune contient un prédicat et certains arguments; prédicat/argument sont des valeurs qui sont une disjonction de contraintes dans la forme d'une chaîne de chacun. Cela nous donne une liste de listes de listes de listes, ouf!
Si l'un de mes QuickCheck propriétés échoue, j'ai tendance à avoir une incompréhensible pageful de sortie. Avant d'expérimenter avec frette, j'ai utilisé à contourner ce problème en ayant arbitraire instances qui pourrait générer seulement une petite série de (petite) des valeurs. La mise en œuvre de la réduction de la fonction pour chacun de mes types semble aider un peu, mais pas autant que je le voudrais. Je reçois toujours un pageful de sortie.
Je pense que je veux de la rétrécir, est une petite liste de littéraux, où chaque littéral a une petite liste de valeurs, qui à son tour a peu de contraintes, dont chacun est aussi court que possible. Mais dans l'exercice de mes efforts, au moins une de ces listes devient assez grand pour faire la sortie d'horrible. Si j'essaie de régler mon rétrécir implémentations, je trouve aussi que le QC commence à prendre un temps très long (de la recherche pour rétrécit?), le type qui amortit mes efforts pour réduire de manière efficace.
Comment pouvez-vous améliorer vos chances de compréhension QuickCheck échecs lorsque vous avez des données imbriquées comme ça?