Když máte štěstí a nesnažíte se zakódovat (složitější) vlastnosti funkcí do typů (což je vidět na jazycích se závislými typy, kde malá změna může znamenat přepsání celého programu).
No haskell zatím dependent typy ještě nemá, ale tak nějak vlastně nerozumím - ano, při refaktoringu člověk občas provede změny, které znamenají, že toho musí přepsat poměrně hodně, ale zatím když se mi to nakonec po přepsání podařilo přeložit, tak to typicky fungovalo...
A i v Haskellu je kolikrát malá změna velký problém - stačí po funkci, která není v IO chtít něco vyprintit a musíte si pomoci ošklivým trikem nebo změnit i mnoho jiných funkcí, z nichž je tato funkce volána (aby všechny byly v IO).
Ošklivým unsafe trikem si rozhodně nepomáhám, ale já nějak nikdy s tímhle problém neměl. Když něco počítám, zajímá mě výsledek. Spíš je problém při debugování, ale tam se tohle toleruje
FP programátoři jsou totiž docela neradi, když jim "pure" kód vyhazuje výjimky.
Což se ale v Haskellu děje celkem často
[] !! 1,
head [],
1`div`0 + řada případů, kdy něco vyhazuje Stack overflow, protože někdo někde nepoužil
seq (třeba
foldl (+) 0 [1..1000000]) nebo kompilátoru něco nedošlo.
[/quote]No a právě pro to lidi, co v haskellu programují
[] !! 1,
head [] prakticky nepoužívají. Někdy si lidi do projektů importují vlastní Prelude, kde jsou všechny tyhle funkce vynechané a konstantně se vede diskuze, jestli to nevyhodit i z oficiálního Preludu (jenomže učte pak začátečníky....). Teď jsem se zoufale snažil přivést ghci ke stackoverflow pomocí foldl a nezdařilo se; mimochodem, to mě docela překvapilo - když se to kompiluje se zapnutou optimalizací, tak se (konkrétně tenhle) foldl zfůzuje a funguje to úplně v pohodě...ale jasně tyhle věci se dějí, ale stalo se mi to snad jednou. Takže v podstatě zbývá to dělení nulou.
Jasně, že to není úplně dokonalé - ale přece jen je trošku rozdíl mezi tím Perlovým kódem, který v klidu vydá "nějaký výsledek", pythoním kódem, který aspoň vyhodí výjimky a Haskellovým kódem, kde konstantně překladač upozorňuje, který že krajní případ programátor zapomněl vyhodnotit....