2012-03-25 20 views
9

Cuando quiero probar el código puro usando QuickCheck, a menudo tengo que escribir una instancia de Arbitrary. Para probar el código monádico, puedo usar Test.QuickCheck.Monadic como se describe en este article.¿Existe una versión monádica de Arbitrary para usar con QuickCheck?

Mi pregunta es: ¿Hay alguna manera canónica para generar datos que dependen de un contexto monádico? En particular, ¿hay alguna versión monádica de Arbitrary? ¿Cómo harías para generar datos que requieran un contexto monádico?

Respuesta

3

generar aleatoriamente un contexto

Sólo generar un contexto monádico azar apropiado. Si estás realizando pruebas, no puedes quedarte en una mónada imaginaria pura, en realidad tienes que elegir una mónada particular para probar. ¿Escogiste una lista de mónada? Generar aleatoriamente una lista como el contexto. ¿Una mónada de estado? Genere aleatoriamente un valor del tipo de estado para el contexto. ¿Escritor? Generar aleatoriamente un registro.

generar aleatoriamente una acción

Entonces, ¿qué quiere generar, exactamente? Si se trata de una acción monádica, debe proporcionar una forma de generar acciones monádicas para su mónada particular, basándose en sus primitivas únicas. p.ej. Las acciones estatales generadas aleatoriamente deben construirse al azar a partir de las primitivas estatales get y put.

ponerlos juntos

Si utiliza las capacidades de QuickCheck para generar una función f que produce una acción monádico, y el uso de QuickCheck para generar un contexto c, entonces puede simplemente c >>= f de ponerlos juntos. O simplemente puede generar la acción a directamente, y hacer c >> a.

6

Gen es básicamente lo que se utiliza para trabajar con Arbitrary casos en un marco mónada, ya que la clase Arbitrary tipo es, básicamente, sólo un proveedor de Gen a generadores.

Cuestiones relacionadas