Я думаю, что вы смотрите на это с слишком детальной точки зрения "функция для функции".
Я бы увидел главное преимущество неизменяемости по умолчанию в языках функционального программирования, заключающееся в том, как оно влияет на реальное мышление разработчика. Когда по умолчанию используется мутация, программистское мышление ориентируется на решения путем изменения данных. Когда по умолчанию используется неизменность, программистское мышление ориентируется на решения путем преобразования данных.
Чтобы выяснить, почему последнее мышление лучше. Разрабатывая программы путем изменения данных, вы в конечном итоге увязаете в мелких деталях, поэтому вы сосредотачиваетесь на том, как программа работает «в малом». При разработке программ путем преобразования данных вам не нужно беспокоиться о многих мелких деталях (например, о том, как различные изменяющиеся части вашей программы взаимодействуют друг с другом), и вы сосредотачиваетесь на том, как работает программа. большой ». Таким образом, последний подход направляет разработчика к более четкой и понятной «общей картине» работы программы.
Хотя хорошая и понятная «общая картина» программы хороша, в некоторых случаях реальные проблемы могут перевесить ее. Некоторые структуры данных (массивы, многомерные массивы) не являются хорошими кандидатами на неизменность из-за высокой стоимости создания новых копий, поэтому всегда следует придерживаться здравого смысла, когда не следует использовать неизменность даже с функциональными языками.
Изменить, чтобы ответить на комментарий:
Пуристы из функционального языка утверждают, что это сделает код более уродливым. Я считаю себя не пуристом, поэтому я так не думаю; ну, возможно, более уродливый с теоретической точки зрения.
F # - нечистый функциональный язык программирования, поэтому он поддерживает изменчивость, когда это необходимо. То, что часть вашего штата изменчива, не отменяет преимуществ того, что большая часть вашего штата является неизменной.
В большинстве случаев вы используете другую (чистую) структуру данных, в которой вы обычно используете массив на императивном языке. Например. кортеж, список или дерево (или компоновка set / map поверх дерева; стандартные библиотеки обычно поставляются с реализациями с хорошей временной сложностью).
И если вы считаете, что вам действительно нужен изменяемый массив (по соображениям производительности), он у вас есть, поэтому ничто не мешает вам его использовать.