Testy dělají to, co typy nesvedou. Typy obvykle nezabrání abych do proměnné měsíc nevložil hodnotu 14, aby se do indexu nedostala hodnota mimo rozsah pole.
Na to jsou enumy a závislostní typy. Důležité jsou typy i testy, vzájemně se doplňují a pokrývají jiná rizika (typy symbolicky, testy ošetřením typických případů).
To s tím indexem mě zaujalo. Zkusil jsem se zamyslet, a uvažovat jak by se dal řešit nějaký jednoduchý příklad s kolekcí.
Postavil jsem to na jednom reálném zadání z práce:
U položky evidujeme 0, 1 nebo 2 záznamy, přičemž buď může být jeden záznam draft, nebo jeden accepted, nebo jeden draft a jeden accepted. Budeme to řešit jako kolekci/pole.
Takže celkem přímočaře si z toho udělám čtyři varianty (pseudokód):
type State = Draft | Accepted
type Choices
= []
| [(State)]
| [(Draft), (Accepted)]
-- Funkce pro přidání:
add :: Choices -> State -> Choices
add xs@[] x = [x]
add xs@[Draft] x@Accepted = [xs : x]
add xs@[Accepted] x@Draft = [xs : x]
Je to trochu humpolácky napsané, příklad je ne úplně reprezentativní, ale berme to jako výhodu.
V podobném duchu si dokážu snadno představit třeba pole o maximální velikosti 42 prvků. Ale už by to asi chtělo nějaký cukr, nebo něco, aby to bylo příjemné.