LINUX.ORG.RU

Порядок вычислений в ФП

 


0

2

Допустим, у нас есть объект(актор), который отвечает на 2 сообщения — foo и bar, возвращая, соответственно, 1 и 2. Далее, мы пишем функцию, которая асинхронно отсылает оба сообщения объекту, и возвращает фьючер, который связывается с переменной. Пусть будет такой псевдокод:

test = function(){returnFirstReceivedFutureOf(object.asyncSend(foo), object.asyncSend(bar))}
aFuture1 = test()
aFuture2 = test()
aFuture3 = test()
Каковы будут значения aFuture1, aFuture2, aFuture3? Любые, в диапазоне 111-222. Мы сколько угодно можем вызывать test, и всегда будем непредсказуемый результат, возможно всегда один и тот же, возможно, всегда разный.

Обратите внимание, тут нет никаких сайд-эффектов. Однако, функция может вернуть разный результат, при разных вызовах. Это происходит по одной простой причине: мы не знаем, какое из сообщений придет первым, foo или bar.

Все это означает следующее: в данной (недетерминистской) программе, отсутствует глобальное состояние вычисления, и, как следствие, тут нет никакой последовательности шагов.

BY CONTRAST

В функциональном программировании, функция всегда возвращает одно и то же. Значит, такая программа, как написана выше, там невозможна. Тогда о каком отсутствии порядка вычислений может идти речь? Ведь многие утверждают, что в ФП он отсутствует. Если порядок вычислений отсутствует, то почему же возвращается всегда одно и то же?



Последнее исправление: javaQest (всего исправлений: 2)

Хочешь диалога - вбрасывай, опираясь на существующую систему понятий, а то, что ты тут насрал кодом неизвестно на чем и терминами без контекста, обсуждения не заслуживает.

Deleted
()
Ответ на: комментарий от Deleted

Если ты с чем-то не знаком, это не значит что этого не существует.

javaQest
() автор топика

Че те надо?

anonymous
()

В функциональном программировании, функция всегда возвращает одно и то же.

В фп нету random()?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Функции с сайд-эффектами выходят за рамки ФП. И, собственно, random к данной теме отношения не имеет. Само по себе наличие сайд-эффектов не означает отсутствия порядка вычислений.

javaQest
() автор топика
Ответ на: комментарий от javaQest

Функции с сайд-эффектами выходят за рамки ФП.

Так и твоя функция из примера тоже с сайд эффектом и тоже выходит за рамки фп.

TDrive ★★★★★
()

Если порядок вычислений отсутствует, то почему же возвращается всегда одно и то же?

А почему не должно возвращаться одно и то же?

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

я не знаю. Если мы изобретем какой-то гипотетический асинхронный рандом, возможно чем-то будет похожа. Но в ФП рандом не считается чистой. То есть, чтобы ответить на твой вопрос, нужно знать внутреннее устройство рандом, его реализацию, причем реализацию на чистом ФП, тогда можно будет о чем то говорить.

javaQest
() автор топика
Ответ на: комментарий от javaQest

функции в фп это математические функции, например f(x,y) = z и тут не важно, что мы найдем первым x или y, у нас один хрен в результате получится z, все.)

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)

Допустим, у нас есть объект(актор)

пока ты не предоставишь формальную семантику, никаких акторов у тебя нет.

anonymous
()
Ответ на: комментарий от TDrive

функции в фп это математические функции, например f(x,y) = z и тут не важно, что мы найдем первым x или y, у нас один хрен в результате получится z, все.)

ты слишком поверхностно себе это представляешь. В ФП x или y, или оба вместе, могут вообще не быть вычислены.

javaQest
() автор топика
Ответ на: комментарий от TDrive

Как это вообще связано с кодом который ты привел?
Если нет порядка, код, показанный в стартовом сообщении должен быть реализуем.

Я надеюсь, ты не стартанешь по третьему кругу, хотя бы.

javaQest
() автор топика
Ответ на: комментарий от javaQest

Если порядок вычислений отсутствует, то почему же возвращается всегда одно и то же?

Это очень легко проверить

есть функция f(x,y) = x - y
предположим что x = 4
предположим что y = 3
f(4,3) = 4 - 3 = 1

теперь мы все сделаем наоборот, сначало предположим что y = 3, а теперь предположим что x = 4 проверяем: f(4,3) = 4 - 3 = 1

Как видишь порядок вычисления аргументов функции разный, а результат один и тот же.
Надеюсь картинки рисовать не нужно?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Как видишь порядок вычисления аргументов функции разный, а результат один и тот же

Тебя вообще не в ту степь понесло, успокойся уже:) Почитай, для начала о различных стратегиях редукций в LC

javaQest
() автор топика
Ответ на: комментарий от TDrive

Кстати, то, о чем ты рассказываешь, это и в императивном то же самое будет, и даже с сайд эффектами тут проблем не возникнет, если аргументы не шарят общую память. Соль в том, что f1(f2(f3)) — вот тут, f2 будет дожидаться f3, a f1 — только после f2.

javaQest
() автор топика
Ответ на: комментарий от javaQest

Я всетаки думаю что либо вопрос задан неправильно, либо ты сам не понимаешь чего спрашиваешь потому что к той формулировки вопроса которая сейчас в первом посте мой ответ подходит на 100%.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

ок, то есть, правильно я пнимаю, что под «отсутствием порядка вычислений», в ФП понимается не отсутствие порядка как такового, а только в пределах вычисления аргументов единственной ф-ции

тут порядок есть someFunCall(тут порядка нет) тут он опять есть
Если так, то все элементарно:) Только непонятно тогда, зачем кукарекать о каком то глобальном его отсутствии

javaQest
() автор топика
Ответ на: комментарий от javaQest

Кстати, то, о чем ты рассказываешь, это и в императивном то же самое будет, и даже с сайд эффектами тут проблем не возникнет, если аргументы не шарят общую память.

Ты опять рассуждая об абстракциях зацыкливаешься на конкретной реализации. там шарят память а там не шарят... это все фигня. Суть фп в том что программисту не нужно указывать порядок вычисления, он описывает систему функций для получения нужного результата а как там это все будет вычисляться его не волнует.

Соль в том, что f1(f2(f3)) — вот тут, f2 будет дожидаться f3, a f1 — только после f2.

Или не будет если для вычисления f1 не нужно знать результат f2. Как ты сам и написал «ты слишком поверхностно себе это представляешь. В ФП x или y, или оба вместе, могут вообще не быть вычислены.»

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

В ФП x или y, или оба вместе, могут вообще не быть вычислены

да, но если они все-таки будут вычислены, они будут вычислены в определенном порядке

javaQest
() автор топика
Ответ на: комментарий от javaQest

порядок вычисления в первую очереть отсутствует для программиста, точнее фактический порядок вычислений не важен.

Пример таблица excel, каждая ячейка это функция, в одной ячейке можно использовать результаты других ячеек, любую ячейку-функцию можно заменить ее результатом... и вот у тебя например в excel список товаров, для каждого из этих товаров вычисляется цена из всяких там налогов, затрат на доставку и тд, потом все цены товаров суммируются и получается общая сумма. важно тебе какая цена была вычислена первой для стула или для колбасы? нет. Важно сколько раз была вычеслена цена велосипеда 1 или 51? нет она всегда одна и таже. вот это и есть фп.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Короче, от порядка вычисления аргументов тут вообще можно абстрагироваться, это не принципиально, выражения редуцируются в соответствии с нормальным ПОРЯДКОМ, вот это важно.

javaQest
() автор топика
Ответ на: комментарий от javaQest

excel да является примером реактивного программирования но я в своем примере ничего про распространение изменений не говорил, только пример абстрогирования от порядка вычислений.

TDrive ★★★★★
()
Ответ на: комментарий от javaQest

возможно, но они ортогональны

это и называется «не взаимоисключающие» )

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

ну, да, ты прав.

Вообще, спасибо тебе, ты мне здорово помогаешь. До меня дошло наконец, что они имеют в виду под «отсутствием порядка», это намного банальней оказалось, чем я думал:) В акторах -то, порядок — это только частный случай хаоса, там вообще global state отсутствует, это как теплое и мягкое:)

javaQest
() автор топика
Ответ на: комментарий от javaQest

Короче, от порядка вычисления аргументов тут вообще можно абстрагироваться, это не принципиально, выражения редуцируются в соответствии с нормальным ПОРЯДКОМ, вот это важно.

Нет, компилятор может смело поменять порядок. Так что глядя на код ты не сможешь сказать, в каком порядке и что будет вычисляться. Именно по-этому и говорится, что порядок не важен.

anonymous
()
Ответ на: комментарий от TDrive

это не взаимоисключающие парадигмы.

Хотя, с этим тоже можно поспорить, по крайней мере в примере с эксель, все таки исключает, по-моему. Каждую ячейку можно рассматривать как переменную со стейтом, и при каждом перерасчете, там деструкция во все края.

javaQest
() автор топика
Ответ на: комментарий от TDrive

он описывает систему функций для получения нужного результата а как там это все будет вычисляться его не волнует.

Пруф или волнует.

Вообще, ты так любишь вести разговоры с этим шизиком, что это наводит на мысль о том, что он твой виртуал, например.

Deleted
()
Ответ на: комментарий от javaQest

Каждую ячейку можно рассматривать как переменную со стейтом, и при каждом перерасчете, там деструкция во все края.

А можно не рассматривать, это все конкретная реализация которая не влияет на абстракцию. И вообще excel я привел только для конкретного примера.

TDrive ★★★★★
()
Ответ на: комментарий от Deleted

Пруф или волнует.

в каких случаях волнует?

Вообще, ты так любишь вести разговоры с этим шизиком, что это наводит на мысль о том, что он твой виртуал, например.

И каких целей я пытаюсь добиться таким образом на лоре?)

TDrive ★★★★★
()
Ответ на: комментарий от Deleted

1. Во многих.

в каких во многих?)

2. Понятия не имею.

Мотив это самое важное в таких предположениях, иначе можно например предположить что ты сейчас сидишь и жрешь говно ложкой. Зачем? Понятия не имею.

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от TDrive

Нельзя предположить, ибо нет для этого предпосылок.

Ладно, приведем классический пример из нетипизированного лямбда-исчисления (только синтаксис другой возьмём, хачкелеподобный).

if True a b = a
if False a b = b
Вот есть вот такая функция. И есть вот такое выражение:
if False (3/0) 4
Слабо, не задумываясь о порядке вычислений, назвать результат выражения?

Deleted
()
Ответ на: комментарий от Deleted

Нормальная форма данного терма - 4. От порядка вычисления наличие нормальной формы и ее вид не зависит :)

anonymous
()
Ответ на: комментарий от anonymous

Конечно, но при аппликативном порядке программа свалится, и факт наличия нормальной формы вряд ли утешит пользователя.

Deleted
()
Ответ на: комментарий от TDrive

Я тоже. О чем ещё поговорим, о бабах?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.