son sienten semana seguidas parto normales muy las hicks falsas empiezan dolorosas dolor cuantas contracciones como braxton haskell quickcheck

haskell - sienten - contracciones sin dolor semana 37



¿Cómo obtengo buenas(pequeñas) contracciones de QuickCheck? (2)

Estoy intentando ejecutar QuickCheck en algunas listas anidadas, algo que se parece a esto:

type Constraint = Text data Value = Value [Constraint] data Literal = Literal Value [Value] type Formula = [Literal]

Entonces, una fórmula es una lista de literales, cada uno de los cuales contiene un predicado y algunos argumentos; predicado / argumentos son valores que son una separación de restricciones en forma de cadena cada uno. Eso nos da una lista de listas de listas, ¡uf!

Si una de mis propiedades de QuickCheck falla, tiendo a obtener una página incomprensible llena de resultados. Antes de experimentar con Shrink, solía sortear esto teniendo instancias arbitrarias que solo podían generar un pequeño conjunto de valores (pequeños). Implementar la función de reducción para cada uno de mis tipos parece ayudar un poco, pero no tanto como me gustaría. Todavía tengo una página llena de salida.

Creo que lo que quiero de shrink es una pequeña lista de literales, donde cada literal tiene una pequeña lista de valores, que a su vez tiene pocas restricciones, cada una de ellas lo más corta posible. Pero en mis esfuerzos actuales, al menos una de estas listas es lo suficientemente grande como para hacer que la salida sea horrible. Si trato de ajustar mis implementaciones de reducción, también encuentro que el control de calidad comienza a demorar mucho tiempo (¿en busca de reducción?), Lo que frena mis esfuerzos para reducir el tamaño de manera efectiva.

¿Cómo mejora sus posibilidades de comprender las fallas de QuickCheck cuando tiene datos anidados como este?



Tuve un problema similar, pero estaba usando C y el generador de ejemplo hecho en casa :) Tuve una implementación lenta y correcta, y rápida e incorrecta.

Usando ejemplos aleatorios, cuando encuentre un ejemplo incorrecto, sugeriría reducir el propio ejemplo. (Esto, por supuesto, podría o debería hacerse por programa, en lugar de por computadora)

Si tiene un predicado para esta prueba y tiene un ejemplo que no funciona, intente eliminar los elementos de las listas, de todos los órdenes (esto debería ser un orden de magnitud lineal de las llamadas) y para cada prueba si falla la prueba.

Si todavía está fallando, no hay razón para mantener esto en el ejemplo.

Si comienza a pasar, entonces este elemento debe permanecer en un ejemplo reducido.

(Esto es codicioso y no óptimo, pero se ejecuta en poli, en lugar de tiempo exponencial, y funcionó para mí)

Para un aspecto más científico, sugiero el capítulo "Simplificación de problemas" del libro "¿POR QUÉ NO PASAN LOS PROGRAMAS ?: Una guía para la depuración sistemática" de A.Zeller.

Nota: esto es principalmente lo que hace el encogimiento ...