Erlang neznám a funkcionální jazyky jen z rychlíku a tak bych se rád zeptal: jak funguje to následující vyhodnocování? Já si vždy myslel, že se v těch pravidlech běžně postupuje zleva doprava a shora dolů. Pak by tam totiž nemusela být ta podmínka...
fact(0) -> 1; fact(N) when N > 0 -> N * fact(N - 1).
Ty bys mozna faktorial ze zaproneho cisla nedelal, ale co ti udela "user" nikdy nevis. Krome toho se ti muze stat, ze mas nekde chybu, ktera pak pouziva tuhle funkci spatne (tj. zaporna cisla). Kdyz pak vychazis z toho ze tvuj faktorial je spravny, tak hledani chyby muze dost zabrat.
Krome toho, kdyz programujes funkcionalne, tak se vzdy snazis aby si ty (casto matematicke) funkce naprogramoval spravne a kompletne. Treba logarithmus neni pro cisla <0 definovany.
Prosim take o odpoved:
Mimochodem řeší se v Erlangu nějak přetečení/podtečení?
A jak si představujete že by měl skončit kód, ze kterého vyndáte "blbuvzdornou" pojistku a záporným parametrem spustíte nekonečnou smyčku, která v každé iteraci sebere dvojnásobek paměti? V Erlangu dojde k tomu, že si virtual machine řekne o paměť, tu od operačního systému nedostane, VM se zastaví a skončí a vygeneruje dump soubor, ze kterého lze při troše štěstí odhadnou kde se stala chyba.
Jsou asi dva duvody proc by to nekdo chtel udelat.
1.) Kontrola vstupu - takhle pri zadani zaporneho cisla to pravdepodobne skonci na OOM a spadne cela Erlang VM, misto aby se hned vratila chyba.
2.) Optimalizace kompilatoru - vsechny "function clauses" se samozrejme neprohledavaji linearne - to by bylo dost pomale (a jsou dost bezne pripady, ze "function clauses" jsou desitky i stovky). Kompilator se snazi vytvorit binarni strom, ktery se pak prochazi. Pokud kompilator vi, ze "function clause" jsou nezavisle (neexistuje hodnota, pro kterou je jich vic splneno), tak muze promichat poradi, aby se dal vytvorit "melci" ( = optimalnejsi) binarni strom.