Myslím, že už to tu několikrát bylo. To, co vyčítáš typovému systému musíš vyčítat i unittestům. Dělají to totiž úplně stejně. To, že zaneseš chybu do typu je podobné, jako zanesení chyby do testů.
A říkám předem, že testy rozhodně nejsou čitelnější jak typy.
Já v tom vidím rozdíl:
- u unit testu ověřuji výsledek, ke kterému jsem mohl dojít naprosto jiným způsobem, než výpočtem tou mojí metodou/funkcí a kódem v ní. Mohla být součástí zadání, mohu ji mít z nějakých Mat-Fyz-Tech tabulek, mohl jsem ji spočítat na kalkulačce a někde ověřit správnost - prostě tu dvojici čísel "konkrétní vstupní hodnota => konkrétní výstupní hodnota" mám ověřenou nezávisle na kódu v mé metodě/funkci a zásah do kódu na té definici nic nemění.
Unit test bude mít jen statickou hromádku vstupních a výstupních hodnot, které ověří - souhlasí/nesouhlasí - nic, v čem by mohla vzniknout nečitelnost, tam nevidím.
- u typového systému duplikuju obsah své metody/funkce jako ověření výsledku, ten nezávislý pohled tam není. Když něco upravím v v kódu, budu asi muset stejnou úpravu udělat v definici výstupního typu = možnou chybu zduplikuju. A co se týká čitelnosti - definice výstupního typu je přesně stejně složitá jako celý můj kód v metodě/funkci.
Nezavrhuju typový systém obecně, ale pro výše uvedený příklad mi prostě na rozdíl od unit testu nedává smysl.