LINUX.ORG.RU

Акторы и рекурсия.


1

1

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

Подход, немного сумасшедший, а может и не немного, но тем не менее.

Возьмем избитый факториал. Я решил, что, следует думать о вызывающей функции, как об объекте, посылающем сообщение. Этот объект знает адреса других объектов, функций, а также переменных, которые в данном контексте тоже есть функции-объекты которые имеют адрес(имя). Итак, наш объект посылает сообщение на адрес, по которому находится он сам, а содержание этого сообщения - это просьба отправить сообщение по следующему адресу с соответствующим аргументом. Само по себе утверждение, что объект может отправить сообщение самому себе, является, на первый взгляд парадоксальным, но этот парадокс кажущийся, когда мы, например, делаем запись в своем ежедневнике, мы делаем именно это - отправляем сообщение самому себе в будущем, а если абстрагироваться от времени, то это и будет - самому себе. Во всяком случае, подход этот даже более понятен, чем рекурсивный вызов, когда мы, выражаясь образно, просим схватить руку саму себя, или просим глаз увидеть самого себя. Получивший сообщение объект, соответственно, знает что делать дальше, поскольку сообщение которое он получил, содержит просьбу о вызове следующего объекта, по адресу(имя ф-ции) с полученным аргументом, и так далее по цепочке.

Здесь, наверное, ключом к пониманию является то, что мы проводим четкую границу между именем функции и самой функцией, ее сущностью. Таким образом, это не «принципиально новый способ», а всего лишь, несколько другой взгляд на вещи. Мы можем смотреть на этот процесс просто как на множество объектов (созданных динамически, но это для нас неважно), которые просто посылают сообщения и ждут ответов, это позволяет смотреть на тот же самый процесс, не как на последовательность вызовов, а как на параллельные процессы, происходящие вне времени, как бы одновременно.

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

Перемещено mono из talks

ОП-пост

Гугли π-исчисление.

Монадки

Игрища с типами. Впрочем нельзя сказать, что это что-то плохое.

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

Краткий ответ - нет, особенно если мы будем рассматривать что-то кроме maybe и вспомним, что к дополнениюк биндк, который я описал есть ещё и ретурн, который поднимает обычное значение в контекст.

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

и пишем как это будет выглядеть в другом языке..

мне кажется, что эти ваши монады имеют фатальный недостаток: их код может неконтролируемо размножаться. IRL это приводит к тому, что приложение ВНЕЗАПНО виснет или падает с сегфолтом. Теоретически конечно это очень любопытно и нужно, но на практике этого лучше избегать.

Особенно в ЯП вроде C/C++, в которых на самом деле все функции и все указатели — глобальные. Т.е. имя может быть и не глобальным, а вот значение — увы.

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

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

стыдно должно быть скорее тебе...

Да ну нафиг, никому они не вперлись в программировании.

...потому-что ты кроме говнокода на пхп за еду ничего никогда не писал и не напишешь в принципе.

emulek
()
Ответ на: комментарий от qnikst
a * v = f();
if (v) {
   return g(*v);
} else return null;

что-то я вообще отказываюсь понимать данный код. Как ты можешь присвоить произведению функцию? Какой сакральный смысл в записи a * v = f();???

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

мне кажется, что эти ваши монады имеют фатальный недостаток: их код может неконтролируемо размножаться.

не понимаю данного жаргона, можешь объяснить, хорошо бы с примером.

IRL это приводит к тому, что приложение ВНЕЗАПНО виснет или падает с сегфолтом.

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

Особенно в ЯП вроде C/C++, в которых на самом деле все функции и все указатели — глобальные. Т.е. имя может быть и не глобальным, а вот значение — увы.

не уверен, но спорить по этому пункту не буду.

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

мне кажется, что эти ваши монады имеют фатальный недостаток: их код может неконтролируемо размножаться.

не понимаю данного жаргона, можешь объяснить, хорошо бы с примером.

«фатальный недостаток» в данном случае: расхождение теории с практикой. Это как применение не евклидовой геометрии для вычисления площади квартиры. Т.е. очевидно, что теория верна, но на практике этот метод ведёт не к увеличению точности, а наоборот, увеличивает вероятность ошибки из-за неоправданно сложной математики.

Это аналогия. А с примером хуже, т.к. я в этой матчасти, как ты знаешь, не слишком силён. Я пробовал, но получается такая лютая ||ета, на которую даже мне смотреть страшно :(

Вангую, что если развернуть твою хаскельную монаду в x86 код, получится ровно тоже самое.

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

единственный способ хранить независимый контекст в сишечке(и вообще в любом реальном вычислителе) — стек. Но железный стек далеко не бесконечный, и его переполнение приводит к сегфолту. А свой костыльный стек приводит к значительному оверхеду.

Особенно в ЯП вроде C/C++, в которых на самом деле все функции и все указатели — глобальные. Т.е. имя может быть и не глобальным, а вот значение — увы.

не уверен, но спорить по этому пункту не буду.

вопрос как раз в том и заключается, что ты не можешь точно сказать, сколько контекстов понадобится монаде. Тебя это не волнует, ты постулируешь, что «хватит». Это теория. На практике — не хватает в железном стеке, а нежелезный тормозит сильно и занимает много места.

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

a это тип

в данном случае надо было писать a *v = f();, раз звёздочка у тебя имеет отношение только к v, а никак не к a.

a *v = f();
if (v) {
   return g(*v);
} else return null;
но так всё равно непонятно, ибо в сишечке нет понятия «функция» как rvalue. Есть только «указатель на функцию» в данном контексте. А именно «функция» имеет не больше смысла, чем деление на ноль.

наверное в сишечке это будет выглядеть так:

#include <stdio.h>


typedef int *(*fptr)();// твой тип "a"

int *f()
{
	static int x = 17;
	return &x;
}

int main()
{
	fptr v = f;// a *v = f();
	if(v)
		return printf("%p() --> %p\n", v, v());// твоя функция g(*v)
	else
		return 0;// твой return NULL;
}

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

Особенно монады. Не подскажете где они применяются, если не пишешь на хаскеле?

F# async workflow в .NET. Просто Дон Сайм благоразумно убрал слово «монада», чтобы не пугать людей)

.NET Linq To Object - тоже. Полностью не уверен на счет выполнения монадических законов, но если это аналогично [a], то должно быть все в порядке.

Rx extensions для .NET, но я особо не смотрел, не использовал. Здесь уже гораздо более серьезные сомнения на счет выполнения монадических законов, но иногда их нарушают ради достижения каких-то практических целей.

Плагин продолжений в Scala. Фактически там монада, это если не считать того, что любую (??) монаду можно выразить через тамошние продолжения (только будет неэффективно) - так тесно связаны эти две сущности. Плагин этот используется в Akka.

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

Окай, с нетерпением жду дальнейших откровений продвинутых программистов.

А где откровения и продвинутые программисты? Просто это была констатация факта. Если хочешь, могу дать подтверждение даже

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

этот твой ник тебе очень идёт — от тебя кроме вони ничего нет. Пожалуй ты будешь первым в моём френдлисте. Потому что в твоих постах я не нашёл ни одной интересной мысли. А размышления о том, «куда идут питушки» меня не интересуют. Если других размышлений не будет, то прощай...

emulek
()

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

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

Быдлодифуры решать - не математика, дорогой мой.

спасибо, посмеялся.

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

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

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

Ну да, помниться тебе и про ФП было все понятно. А ты значится, с акторами на короткой ноге? Что скажешь про неограниченный индетерминизм?

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

Ты шутишь? Это напрямую связано с акторами, основное свойство модели акторов, отличающее его от традиционных моделей вычислений.

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

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

Нет, не шучу. Приставка «in-» - это латынь в русском значении «не-». Приставка «non-» - не помню уже, то ли латынь, то ли английская. В чем разница между ними? Вопрос скорее языковедческий)

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

А, ну да, извини, не так понял. Вроде это одно и то же, ты прав, недетерменизм и индетерменидм - это синонимы. А я подумал, что ты спрашиваешь, что такое это вообще:) Издержки языковой семантики, вспоминается как нас в детском мультике учили, как важно расставлять запятые: «Казнить, нельзя помиловать», вероятно, эти имбицилы действительно верили, что запятыми можно разрулить семантические конфликты в языке:)...

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

к слову тот же эффект будет при уничтожении рекурсии через использование оператора неподвижной точки: fix :: (\a -> a) -> a.

А с экторами интересный вопрос в том, что актор делает с данными после вычисления или передаёт дальше (CPS) или возвращает назад (таже самая рекурсия).

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

или возвращает назад (таже самая рекурсия)

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

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

Ну да, помниться тебе и про ФП было все понятно. А ты значится, с акторами на короткой ноге? Что скажешь про неограниченный индетерминизм?

нет, не на короткой. Я не знаю что это такое. И знать пока не хочу. Мой пост был не о том.

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

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

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

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

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

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

Любую монаду можно выразить через продолжения, гуглить по mother of all monads, примеры у Дона Пиппони и статья у Олега, ну и дальше по ссылкам.

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

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

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.