Короткий ответ заключается в том, что в функциональном стиле каждый объект данных будет неизменным, поэтому обновление - это действительно новый объект данных с обновленным значением, что-то вроде того, как работают строки в .NET.
Реальные интересные проблемы возникают при работе с IO, становится трудно моделировать ввод / вывод чисто функциональным образом, что приводит к обходным решениям, таким как Monads .