Página de Guillaume Hoffmann

View on GitHub

% Práctico Haskell 11: QuickCheck

Preparación

Instalá el paquete QuickCheck usando cabal install QuickCheck o stack install QuickCheck.

Descargá Ring.hs.

QuickCheck : verificando anillos

Vamos a hacer tests con QuickCheck para asegurarnos que las instancias de Ring cumplan con las propiedades de los anillos.

Probablemente vas a necesitar este encabezado en tu módulo:

{-# LANGUAGE RankNTypes #-}
import Test.QuickCheck
import Control.Monad

Ejercicio 1

Si querés verificar los anillos, vas a necesitar instancias Arbitrary para Mod5 y Mat2x2 para que QuickCheck pueda crear valores arbitrarios para esos tipos. Averiguá la documentación de la clase Arbitrary. Vas a ver la función arbitrary :: Gen a, esta es la que debés implementar.

Fijate en la parte de la documentación que se llama “Random generation”, en particular “generator combinators”. Estos combinadores van a ser útiles. Lo más importante, es que Gen es instancia de la clase Monad, o sea, ¡es una mónada! Entonces podés empezar con arbitrary = do ... y seguir así.

Escribí instancias Arbitrary para Mod5 y Mat2x2.

Podrás probar tus instancias en GHCi evaluando las expresiones siguientes:

Ejercicio 2

Leé la página de Wikipedia sobre anillos.

Un poco más abajo en la página, vas a ver las 9 propiedades que un anillo debe tener. Codificá esas propiedades de forma que se puedan usar con QuickCheck. Para ser compatible con nuestro test automático, nombralos desde prop_1 hasta prop_9.

Asegurate que tus propiedades anden con quickCheck ejecutando, por ejemplo, quickCheck prop_1 en GHCi. Si querés testear otra cosa que Integer, tenés que agregar una anotación de tipo, como por ejemplo quickCheck (prop_1 :: Mat2x2 -> Mat2x2 -> Bool).

Ejercicio 3

Uno de los anillos definidos en Ring.hs está roto. Utiliza tus tests para encontrar cuál, y escribí tu descubrimiento como comentario en tu código.

Fuente