% 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:
sample (arbitrary :: Gen Mod5)
sample (arbitrary :: Gen Mat2x2)
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.