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)
Ответ на: комментарий от TDrive

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

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

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

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

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

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

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
()
Ответ на: комментарий от Deleted

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

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

В случае же нормального порядка - мы знаем, что у терма есть нормальная форма (если есть), знаем, какая она (без всяких редукций, просто нормализованный терм из данного класса эквивалентности) - этого нам достаточно, чтобы делать выводы об этой программе. А какими именно редукциями терм будет приведен к этой нормальной форме (каков актуальный порядок редукций) нам неизвестно, это выбор компилятора. Мы только знаем, что _как-то_ он приведет. Гарантированно. К тому что надо.

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

Это да (если все функции чистые), но опять же, далеко не все ФП-языки исповедуют нормальный порядок редукций.

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

нам неизвестно, это выбор компилятора

Финты компилятора никакого отношения к семантике не имеют.

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

Финты компилятора никакого отношения к семантике не имеют.

Они имеют отношение к тому, что мы не знаем какой будет порядок редукций (семантика языка его не определяет, его нет). Именно по-этому компилятор _может_ менять этот порядок. Если бы мы знали порядок редукций (он бы был специфицирован) - компилятор бы его менять не мог, так как это бы нарушило семантику языка.

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

Очевидно, что он серьезно болен^W^Wобычная вниманиешлюшка, и его мотивация для обывателя может некоторое время оставаться загадкой.

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

Они имеют отношение к тому, что мы не знаем какой будет порядок редукций (семантика языка его не определяет, его нет).

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

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

Вообще, ты так любишь вести разговоры с этим шизиком

А ведь ты, говоришь, по сути, то же что и он, (в отличии от других участников, за исключением qulinxao) Странно.

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

Кто «он»?

кого ты назвал шизиком

По какой сути?

По-поводу наличия порядка вычислений в ФП.

Я молчал.

Ты сказал достаточно, чтобы понять твою позицию по этому вопросу.

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

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

Нет, не определяется. В LC вообще нету никаких редукций. И в семантике чистых языков, с-но, никакого порядка определять не надо, все будет работать и без него.

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

В какой именно семантике?

У LC нету никакой семантики. Это просто язык (набор термов построенных по определенным правилам), отношение эквивалентности на них и выделенное множество нормализованных термов.

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

В естественной

Это что-то новенькое.

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

Не бета-редукция, а бета-эквивалентность (и еще ряд других эквивалентностей). А вот потом уже, если захочется, мы можем и редукциях начать говорить - если захотим не прсото утверждать о том что в классе данного терма существует нормализованный, но и конструктивно к приводить нему данный.

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

а бета-эквивалентность (и еще ряд других эквивалентностей)

а факториал 5 эквивалентен факториал 4?

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

рандом, его реализацию, причем реализацию на чистом ФП

не вдаваясь в казуистику касательно чистоты ФП, не могу не процитировать одного замечательного учёного (неслабо приложившего руку и к программированию в том числе):

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

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