Typy v C++ jsou hrubé, syntaxe je ošklivá, ale co do schopností jsou velmi mocné. C++ má jeden z nejsilnějších typových systémů ze všech mainstreamových jazyků. Kód ení moc hezký, ale principy jsou tam stejné jako ve zbytku světa. Takže prosím ignoruj jazyk a soustřeď se na principy. Ty jsou to o co mi jde.
Nenech se znérvóznit mou antipatií k C++. Je to přeci jen už dlouho, co jsem v něm dělal. :-)
Typy v Haskellu tohle moc neřeší. Jestli kus kódu může selhat nezávisí na jazyce, ale na tom, co ten kus kódu dělá. V Haskellu jsem toho napsal taky dost. Monáda ti ten "fail" bude propagovat nahoru úplně stejně neviditelně jako výjimky v c++. A v haskellu taky IMO nejde zaručit že kus monadického kódu ten fail nezavolá. A pure věci nakonec stejně musíš protlačit do toho stavového světa (nebo ten vnější RealWorld něčím prohnat ).
Předpokládejme, že máme nějakou strukturu, jako to
__exit__ u Pythoního
with. Tvrdíš (a já nemám důvod nesouhlasit), že musíme zajistit, aby to
__exit__ nevyhazovalo výjimku. OK. Co brání, aby v případě, že kompiler zjistí, že v něm je výraz, který výjimku
1) vyhazuje odmítl kód přeložit? (Odmysleme si, že teď lepím syntaxi z Pythonu, na typované myšlení z Haskellu.)
Tudíž nemohu souhlasit, že to Typy v Haskellu neřeší. Domnívám se, že naopak. Naopak!
Monáda ti ten "fail" bude propagovat nahoru úplně stejně neviditelně jako výjimky v c++.
Jak neviditelně?! Vždyť naopak, ty monády jsou v Haskellu největší pruda, protože jdou vidět moc.
A v haskellu taky IMO nejde zaručit že kus monadického kódu ten fail nezavolá.
Tady je nějaký zmatek v názvosloví.
Monáda nemůže selhat. Monáda nemůže zavolat fail. Monáda má množinu stavů, jeden z nich může být klasifikován jako chyba. Zaručený je tam všude všechno.
Moc ti teď bohužel nerozumím.
1) Výjimkou myslím klidně i Monádu, IOMonádu, Effects, cokoliv co bychom potřebovali.