Mejores prácticas de Haskell QuickCheck (especialmente al probar clases de tipos)

Acabo de empezar a usar QuickCheck con un montón de código Haskell. Estoy atrasado de los tiempos, lo sé. Esta pregunta es de dos partes:

En primer lugar, ¿cuáles son las mejores prácticas generales para Quick Check? Hasta ahora, he recogido lo siguiente:

Nombra tus pruebas prop_ * (molesto, porque todo lo demás es camelCase)Pruebe el código exportado (si está probando internamente, es probable que lo esté haciendo mal)Propiedades de prueba, no ejemplos.No digasX is out of range, Y is in rangeEn cambio, diif x is out of range, normalize x ≠ x (o alguna otra propiedad similar)

Pero todavía estoy tomando otras mejores prácticas. Particularmente:

¿Dónde se guardan las propiedades?¿El mismo archivo?en untest/ ¿directorio? (Si es así, entonces, ¿cómo importar las cosas ensrc/?)en unProperties/ directorio bajosrc?

Más importante aún, ¿cómo tendemos a probar las propiedades en las clases de tipos? Por ejemplo, considere la siguiente clase de tipo (simplificada):

<code>class Gen a where
    next :: a -> a
    prev :: a -> a
</code>

Me gustaria probar la propiedad∀ x: prev (next x) == x. Por supuesto, esto implica escribir pruebas para cada instancia. Es tedioso escribir la misma propiedad para cada instancia, especialmente cuando la prueba es más complicada. ¿Cuál es la forma estándar de generalizar tales pruebas?

Respuestas a la pregunta(3)

Su respuesta a la pregunta