Hrál jsem si typem Date, jen pro ukázku:
Naivní implementace, naprosto nedostatečná (a v reálu nejpoužívanější):
type Data = {year: Int, month: Int, day: Int}
O něco málo lepší:
type Data = {year: Int, month: Int 1 12, day: Int 1 31}
elm-package* zařve, protože se změnila logika
Už použitelná:
type Data = {year: Int, month: 1|3|5|7|8|10|12, day: Int 1 31}
| {year: Int, month: 4|6|9|11, day: Int 1 30}
| {year: Int, month: 2, day: Int 1 28}
elm-package zařve, protože se změnila logika
A mohl bych pokračovat dál a dál, zohlednit rok nula, zohledňovat přestupné roky, ...
Každopádně ta elegance se s ukecanýmy a nedostatečnými testy nedá srovnat.
Nevěřím, že by ty typy skutečně dokázali popsat všechno. Ale těch hranic se nedokážu dopátrat :-)
* elm-package ve skutečnosti samozřejmě nezařve, protože Elm neumí závislostní typy, ale jde o princip, kdy nějaký nástroj typů dokáže vykrást doménu testů.