Ну и в целом, с распараллеливанием насколько я знаю у функциональных языков пока что всё довольно грустно.
Ну да. Насколько я знаю, основной механизм распараллеливания в функциональных языках -- это "parallel map" -- независимое применение функции к элементам списка. Но подобные возможности есть и большинстве параллельных расширений/библиотек для императивных языков. В эрланге встроенных возможностей, конечно, больше, но он
изначально проектировался как язык для программирования распределенной обработки данных.
Ещё один плюс это то, что функция становится отдельной сущностью, типом данных. В системном программировании это особо не нужно.
В "системном" программировании это тоже нужно: механизм callback'ов используется с незапамятных времен. Но с тех же незапамятных времен нет никаких проблем с его реализацией.
Вот, скажем интеграл - некоторая функция, входными параметрами которой является другая функция и пределы интегрирования. В плюсах пришлось бы колдовать с шаблонами или делегатами.
Какое "колдовство" Вы видите в таком описании?
Код:
double Integrate(double (*fnc)(double x), double xMin, double xMax)
Или в C#:
Код:
double Integrate(Func<double, double> fnc, double xMin, double xMax)
И вызов:
Код:
double v = Integrate(x => x * x, 0.0, 1.0);
А если функция имеет другой синтаксис - вообще беда.
Что имеется в виду?