Самым мощным опытом, который я имел, смешивая ОО (в частности, мутацию) и функциональное программирование, является достижение прироста производительности за счет внутреннего использования изменяемых структур данных и одновременного использования всех преимуществ неизменяемости для внешних пользователей.Отличным примером является реализация, которую я написал алгоритма, который дает лексикографические перестановки, которые вы можете найти здесь .Алгоритм, который я использую, является обязательным по своей сути (повторяющиеся шаги мутации массива), который может пострадать, если он будет реализован с функциональной структурой данных.Взяв массив ввода, сделав его копию, предназначенную только для чтения, первоначально, чтобы вход не был поврежден, а затем получив копии только для чтения в выражении последовательности после выполнения шагов алгоритма мутации, мы получаем точный балансмежду ОО и функциональными методами.Связанный ответ ссылается на исходную реализацию C ++, а также оценивает другие чисто функциональные ответы реализации.Производительность моей смешанной OO / функциональной реализации находится между превосходящей производительностью решения OO C ++ и чистого функционального решения F #.
Эта стратегия внутреннего использования OO / mutable при сохранении чистого для вызывающей стороныиспользуется во всей библиотеке F #, особенно при непосредственном использовании IEnumerators в модуле Seq.
Еще один пример можно найти, сравнив запоминание с использованием изменяемой реализации словаря с неизменяемой реализацией Map, которую Дон Сайм исследует здесь.Реализация неизменяемого словаря более быстрая, но не менее чистая в использовании, чем реализация Map.
В заключение, я думаю, что использование изменяемого ОО в F # наиболее эффективно для разработчиков библиотек, стремящихся к повышению производительности, при этом все чисто функционально для потребителей библиотек..