Invarianty objektů můžete kontrolovat v __setattr__. Atributy ORM modelů se nespecifikují v __init__. Používal jste SqlAlchemy nebo Django? Můžete provádět mnohem složitější validace než by vám umožnil typový systém.
Jenže mě ani nešlo o nic složitého (navíc to nebyl ORM objekt). Jde o to, že se podívám na definici třídy a nevím vůbec nic. Init metoda je na stránku, a teď abych hledal přiřazení do "self", jaké to má vlastně atributy a pak ještě vymýšlel, jaký asi mají typ (nedejbože, že bych použil atribut různých typů....), případně ještě prolézal funkce, které ten __init__ volá, jestli se náhodou někde něco nepřiřazuje.
Konkrétně teda v Haskellu je ten objekt imutable, a pokud chci, aby byly dodrženy invarianty, tak nevyexportuju konstruktor, ale vyexportuju "inteligentní konstruktor", který je vynutí. V Javě se to řeší private atributama a konstruktorem, který to vynutí (a kvantem getterů/setterů...) v C++ také...
Dokážete pomocí typové kontroly validovat nějaký dlouhý formulář, kde jsou validace jednotlivých položek na sebe navázány?
No asi použiju ten inteligentní konstruktor viz výše...
Jak překladač kontroluje, že jste při ukládání do databáze nepřehodil názvy položek?
Já teda nechtěl, aby tohle dopadlo jako promo haskellu (ani jsem to Jakubovi nedoporučoval)...ale pokud to je přes nějaké ORM, použijí se generické funkce na přístup do databáze resp. konverzi do JSONu. Takže tam zrovna moc nic na spletení není. Ale tohle IMO funguje snad i v Javě, není to nic objevného. A když je to všechno generované automaticky, tak opět není moc důvod tyhle věci testovat....
V Haskellu je trošku anti-pattern mít funkci, která bere více parametrů stejného typu, takže se to pak řeší tím, že má každá položka separátní typ - tzn. např. typ "Jméno", "Příjmení", "Adresa". Takže se pak nestane, že se funkce, která má parametr "Příjmení", zavolá místo toho s "adresou". Takže se opět zmenšuje prostor pro chybu a snižuje "benefit" testování.
Jak překladač zjistí, že jste neudělal chybu v regulárním výrazu?
Pokud jde o regexpy - v haskellu se regexpy prakticky nepoužívají (napsat si parser je výrazně jednodušší a není to write-only jako regexpy... ať žije udržovatelnost kódu...). Nicméně je na to nějaká
knihovna, která to compile-time zkompiluje (možná i zkontroluje korektní počet group)...