Говоря как кто-то, кто занимался ОО в течение многих лет, а недавно строил крупный проект, требующий большой скорости (автоматизированная система торговли опционами в реальном времени) в Haskell:
- Существуют ли действительно существенно разные модели использования структур данных между функциональным и императивным программированием?
Если вы говорите о Хаскеле, да, очень сильно. Однако большая часть этого обусловлена чистотой; различия немного меньше в других функциональных языках, где чаще используются изменяемые данные. При этом, как отмечали другие, рекурсивный код и структуры гораздо интенсивнее используются во всех или почти во всех функциональных языках.
- Если это так, это проблема?
Это был не один для меня, за исключением того, что мне пришлось потратить некоторое время на изучение нового способа работы. В частности, производительность, безусловно, не была проблемой: система, над которой я работаю, работает значительно быстрее, чем предыдущая реализация Java, например.
- Что если вам действительно нужна хеш-таблица для какого-либо приложения? Вы просто проглатываете дополнительные расходы, понесенные за модификации?
Как правило, проблема не в том, что «вам действительно нужна хеш-таблица», а в том, что вам нужен доступ к определенным данным в течение определенных временных ограничений (которые могут быть «максимально быстрыми на некотором данном оборудовании»). , Для этого вы оглядываетесь и делаете то, что вам нужно. Если это включает введение изменчивости, я не вижу большой проблемы с этим, и вы можете сделать это в Haskell, хотя это может быть не так удобно, как в других языках. Но имейте в виду, что если у вас есть проблемы такого рода, это, безусловно, будет не так просто, как «использовать универсальную хэш-таблицу, и все готово». Чрезвычайно высокая производительность для определенной функциональности на определенной аппаратной платформе неизменно требует большой работы, а обычно и нескольких хитростей. По моему мнению, предпочтение одной языковой реализации над другой только потому, что в ней есть какая-то конкретная вещь, которая работает лучше, чем в других языках, является довольно несложным подходом к разработке программного обеспечения, который вряд ли будет последовательно давать хорошие результаты.