Допустим, у нас есть объект(актор), который отвечает на 2 сообщения — foo и bar, возвращая, соответственно, 1 и 2. Далее, мы пишем функцию, которая асинхронно отсылает оба сообщения объекту, и возвращает фьючер, который связывается с переменной. Пусть будет такой псевдокод:
test = function(){returnFirstReceivedFutureOf(object.asyncSend(foo), object.asyncSend(bar))}
aFuture1 = test()
aFuture2 = test()
aFuture3 = test()
Обратите внимание, тут нет никаких сайд-эффектов. Однако, функция может вернуть разный результат, при разных вызовах. Это происходит по одной простой причине: мы не знаем, какое из сообщений придет первым, foo или bar.
Все это означает следующее: в данной (недетерминистской) программе, отсутствует глобальное состояние вычисления, и, как следствие, тут нет никакой последовательности шагов.
BY CONTRAST
В функциональном программировании, функция всегда возвращает одно и то же. Значит, такая программа, как написана выше, там невозможна. Тогда о каком отсутствии порядка вычислений может идти речь? Ведь многие утверждают, что в ФП он отсутствует. Если порядок вычислений отсутствует, то почему же возвращается всегда одно и то же?