Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
…
2) Это важно по той причине, что существуют алгоритмы, которые, будучи записаны в функциональном стиле, поимеют добавочный log(N) в своей асимптотике (и никакие фокусы вроде монад и уникалных типов не помогут). И по другому никак. Depth-first graph traversal — пример такого алгоритма (O(N) императивный, О(N)log(N) ффункциональный). А испорченная асимптотика во многих случаях гораздо хуже плохой кодогенерации.
…
Программист на OCaml здесь выкрутится, выделив в алгоритме небольшую императивную часть и избавившись от log(N). А вот программистам на Clean и Haskell придется хуже — в тяжелом случае придется выносить часть алгоритма в С++. Что, впрочем, не фокус — прямо скажем. Вставки на ассемблере в программу на С лет десять назад никого не пугали, надо заметить.
И это еще не все. В функциональном коде применяются доволно специфические структуры данных, имеющие, с одной стороны, большуу константу при О для основных операций, но с другой стороны, аллокаторы этих языков заточенны под элементы таких структур данных. Так что впрямую сравнивать производительность программ нельзя — в случае ФЯ выбирается другая структура данных, а значит, будет отличаться и алгоритм. Естественно — в медленную сторону. Т.е либо будет больше константа в алгоритме, либо до кучи все еще и умножится на log(N).
Все эти стеки, очереди, кучи, деревья, графы (будь они не ладны) и прочие “остроумные” названия непонятных и сложных структур данных ни как не хотели закрепляться в моей головеНу вот к названиям ленивые студенты ещё не прикапывались.
Чисто функциональные структуры данных