Näissä harjoituksissa tutustutaan ohjelmien testaamiseen. Testaus on jokaisen ohjelmoijan arkipäivää ja se on tyyppien jälkeen tärkein tapa tuottaa konsistenttia koodia. Testaaminen on työläämpää kuin tyypintarkastus, mutta vähemmän tehokasta ja vähemmän vaivalloista kuin todistaminen.
Tämä kappale perustuu Real World Haskellin lukuun 11.
Funktio-ohjelmoinnin sivuvaikutukset 1
Maatalouden tutkimusinstituutti tekee tutkimusta siitä, kuinka eri lannoitteet vaikuttavat pellolla. Johtuen epätarkoista traktorikuskeista, lannoitteita ei kuitenkaan saada aina sinne minne pitää. Lannoitetut alueet pystytään kuitenkin aina tekemään kompassiakselien suuntaisiksi suorakaiteiksi ja niiden sijainti tiedetään.
Toteuta kätevä ja turvallinen kirjasto tälläisen tutkimusaineiston käyttöön. Kirjaston tulee pystyä käsittelemään suorakaiteita ja niihin liittyviä biomassa- ja lannoitearvoja. Koska lannoite- ja mittausalat voivat olla osittain päällekkäin, niin kirjasto tarvitsee ehdottomasti funktiot, joilla voidaan laskea, leikkaavatko nämä alat, millainen suorakaide leikkaus on, mikä on suorakaiteiden tai niiden yhdisteen pinta-ala sekä määritellä pienin mahdollinen suorakaide, joka kattaa koko mittausjoukon.
Monoid
, Functor
, Applicative
tai Monad
? Esimerkiksi suorakaide, johon on liitetty jokin mittaustieto, lienee funktori mittaustiedon suhteen.Mitä lainalaisuuksia funktioidesi ja operaattoreidesi kuuluu noudattaa, että malli on oikea? Esimerkkeinä voit käyttää seuraavia:
Kirjoita lainalaisuudet formaalisti QuickCheck-määreinä (ks. Real World Haskell, kappale 11).
Testaa lainalaisuutesi QuickCheckillä.
Löysitkö virheitä? Kerro, mitä virheitä teit, ja mikä testi paljasti ne.
Testaa HPC ohjelmalla, että testisi kattavat koko kirjaston.
Todista (käsin) mielestäsi olennaisin tai heikoimmin QuickCheckille sopiva lainalaisuus.
Criterion
-moduli toimii. (Ks. myös kurssin video suoritusajan mittauksesta)Tärkeää: Tämäkin on tehtävä!
Kiitokset kuvasta Eerik Kukkoselle. ↩