Один из promises свободного от побочного эффекта, ссылочно прозрачный функциональный программирование заключается в том, что такой код может быть сильно оптимизирован. Чтобы процитировать Wikipedia:
Неизбежность данных во многих случаях может привести к эффективности выполнения, позволяя компилятору делать допущения, которые являются небезопасными на императивном языке, тем самым увеличивая возможности текстового расширения для встроенного расширения.
Я хотел бы видеть примеры, когда компилятор функционального языка превосходит повелительный, создавая лучший оптимизированный код.
Изменить: Я попытался дать конкретный сценарий, но, видимо, это была не очень хорошая идея. Поэтому я попытаюсь объяснить это по-другому.
Программисты переводят идеи (алгоритмы) на языки, которые могут понять машины. В то же время одним из наиболее важных аспектов перевода является то, что люди также могут понять полученный код. К сожалению, во многих случаях существует компромисс: сжатый, читаемый код страдает от низкой производительности и нуждается в оптимизации вручную. Это подвержено ошибкам, занимает много времени, и делает код менее читаемым (до совершенно нечитаемого).
Основы функциональных языков, такие как неизменяемость и ссылочная прозрачность, позволяют компиляторам выполнять обширные оптимизации, которые могут заменить ручную оптимизацию кода и свободных программистов из этого компромисса. Я ищу примеры идей (алгоритмов) и их реализации, которые:
- (функциональная) реализация близка к оригинальной идее и ее легко понять,
- он интенсивно оптимизируется компилятором языка и
- трудно (или невозможно) написать аналогично эффективный код на императивном языке без ручных оптимизаций, которые уменьшают его краткость и удобочитаемость.
Извиняюсь, если это немного расплывчато, но я надеюсь, что идея понятна. Я не хочу давать ненужные ограничения на ответы. Я открыт для предложений, если кто-то знает, как выразить это лучше.
Мой интерес не только теоретический. Я хотел бы использовать такие примеры (среди прочего), чтобы побудить студентов заинтересоваться функциональным программированием.
Сначала меня не устраивало несколько примеров, предложенных в комментариях. Во-вторых, я возвращаю свои возражения, это хорошие примеры. Пожалуйста, не стесняйтесь расширять их до полных ответов, чтобы люди могли комментировать и голосовать за них.
(Один класс таких примеров будет, скорее всего, параллельным кодом, который может использовать преимущества нескольких процессорных ядер. Часто на функциональных языках это можно сделать легко, не жертвуя простотой кода (например, в Haskell, добавив par
или pseq
в соответствующих местах). Я также заинтересован в таких примерах, но также и в других, непараллельных.)