Относительно # 2 ...
Некоторые другие вещи могут зависеть от
новые данные.
Это то, что пуристы называют "эффектом". Понятие множественных ссылок на объекты на один и тот же изменяемый объект - это сущность изменчивого состояния и суть проблемы. В ООП у вас может быть объект «a» типа BankAccount, и если вы читаете a.Balance или еще много чего в разное раз , вы можете увидеть разные значения. Напротив, в чистом FP, если «a» имеет тип BankAccount, то он неизменный и имеет одно и то же значение независимо от времени.
Поскольку, однако, BankAccount - это, по-видимому, объект, который мы хотим смоделировать, состояние которого меняется со временем, мы в FP закодировали бы эту информацию в типе. Таким образом, «a» может иметь тип «IO BankAccount» или какой-либо другой монадический тип, который по сути сводится к тому, чтобы сделать «a» фактически функцией, которая принимает в качестве входных данных «предыдущее состояние мира» (или предыдущее состояние банковских процентных ставок или что угодно) и возвращает новое состояние мира. Обновление процентной ставки будет другой операцией с типом, который представляет эффект (например, другая операция ввода-вывода), и, таким образом, вернет новый «мир», и все, что может зависеть от процентной ставки (мировое состояние), будет данными с тип, который знает, что нужно принять этот мир в качестве входных данных.
В результате, единственный возможный способ вызвать «a.Balance» или что-то в этом роде - это использовать код, который благодаря статическим типам гарантирует, что некоторая «мировая история, которая нас дошла до сих пор», была правильно подключена к точка вызова, и какая бы мировая история ни была входной, влияет на то, какой результат мы получим от a.Balance.
Чтение о State Monad может быть полезно, чтобы получить представление о том, как вы просто моделируете «разделяемое изменяемое состояние».