Здравствуйте, VladD2, Вы писали:
AB>>а если код вот такой AB>>
AB>>def pure A(act : int->int) { act(5)+2; } //pure
AB>>def B(act : int->int) { A(act); } //не pure
AB>>main() {
AB>> ArrayList ar = ArrayList();
AB>> B(x => x*2);
AB>> B(x => { ar.Add(x); x*2; }
AB>>}
AB>> AB>>тогда что? VD>Тогда в последней строчке ошибка будет.
это по какому такому правилу ошибка будет?
функция B — грязная, и я могу передавать туда все что захочу.
так что единственным местом где может быть ошибка это код самой B в моменте вызова A (как в примере из языка D).
это и будет шлюзом между мирами, но формально он будет соответствовать const_cast-у, как его не назови.
Здравствуйте, para, Вы писали:
P>почему просто не потребовать, чтоб на вход чистой функции подавались чистые делегаты: P>
P>def pure B(act : pure int->int) { A(act); }
P>
Это и так подразумевается. Все функциональные типы передаваемые в чистую функцию обязаны быть чистыми.
Тут вопрос стоит как это контролировать. Можно засунуть информацию о чистоте в тип функционального типа, а можно контролировать это дело только при вызове.
P>чистый делегат можно создать из чистой функции лимбо из лямбды P>А макрос MrkAsPure — проверяет чистоту лямбды и возвращает чистый делегат P>
P>def ar = List();
P>B(MrkAsPure(x => { ar.Add(x); x * 2; }))
P>
P>да и наверняка, можно сделать это автоматически без явного вызова MrkAsPure
MrkAsPure нужен для передачи не чистой (или функции чистота которой не установлена) функции.
С чистыми все и так ясно. Сложность здесь скорее будет в том, что функции могут формироваться динамически (из кучи лямбд и замыканий).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Все функциональные типы передаваемые в чистую функцию обязаны быть чистыми.
Почему? А если эта функция просто добавляет данное значение в immutable список функций? Она вполне может быть чистой, даже если добавляемое значение (принимаемое в качестве аргумента) — функция с побочными эффектами.
Здравствуйте, VladD2, Вы писали:
VD>Все функциональные типы передаваемые в чистую функцию обязаны быть чистыми. VD>Тут вопрос стоит как это контролировать. Можно засунуть информацию о чистоте в тип функционального типа, а можно контролировать это дело только при вызове.
А как контролировать при вызове? Что делать, если функциональный аргумент — это результат вызова другого метода, или если он извлекается из коллекции (массива, списка и т.д.)? По-моему, без изменения системы типов тут не обойтись.
Здравствуйте, nikov, Вы писали:
N>А как контролировать при вызове? Что делать, если функциональный аргумент — это результат вызова другого метода, или если он извлекается из коллекции (массива, списка и т.д.)?
Прослеживать цепочки вызовов. Чистый метод не может вернуть грязную лямбду если на вхоже у него тоже все чистое.
Массивы и переменные тоже нужно делить на чисты и грязные.
N>По-моему, без изменения системы типов тут не обойтись.
В прнципе можно, но пожалуй проще заложить данную информацию в тип. Проблема такого решения заключается в том, что ее придется кодировать в получаемых сборках и она будет доступна только для сборок созданных на этом же языке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
N>>По-моему, без изменения системы типов тут не обойтись.
VD>В прнципе можно, но пожалуй проще заложить данную информацию в тип. Проблема такого решения заключается в том, что ее придется кодировать в получаемых сборках и она будет доступна только для сборок созданных на этом же языке.
Здравствуйте, nikov, Вы писали:
N>А вправе ли чистый метод кидать исключение?
Если не страдать пароноей, то по-моему — да. Я рассматривю исключение как остановку вычислений и считаю их не приемлемыми для штатной передачи управления внтури кода.
Вот ловить исключения — это несколько другой вопрос. Это можно и запретить. Тогда исключение внутри чистого кода будет по любому приводить управление в грязный код который имеет право делать все что ему взбредет в голову.
В многопоточном окружении исключения весьма частый зверь. Так что без них никуда.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вот ловить исключения — это несколько другой вопрос. Это можно и запретить. Тогда исключение внутри чистого кода будет по любому приводить управление в грязный код который имеет право делать все что ему взбредет в голову.
Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.
Здравствуйте, VoidEx, Вы писали:
VE>Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.
Ты чаем форумом не ошибся?
Просьба, недохаскели осбуждать где-нибудь в другом месте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, VoidEx, Вы писали:
VE>>Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.
VD>Ты чаем форумом не ошибся?
Нет, я лишь указал, что все возникающие вопросы по поводу чистоты уже решены. Ты и сам вроде придерживался мнения, что сначала неплохо бы разобраться, как нечто сделано в других языках, а то получится как в D.
VD>Просьба, недохаскели осбуждать где-нибудь в другом месте.
Да где ж, как не здесь.
Здравствуйте, VoidEx, Вы писали:
VD>>Просьба, недохаскели осбуждать где-нибудь в другом месте. VE>Да где ж, как не здесь.
В Философии. На крайняк в Декларативном программировании.
А вообще, если нет чего сказать конструктивного, то можно и воздержаться. Лично мне на подобные выпады даже реагировать не хочется. Потратишь кучу времени на объяснение прописных истин и в итоге все равно ничего кроме флэйма не получишь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Ну, дык это иногда нужно. Скажем для логирования.
Для таких вещей можно какой-нибудь хитрый атрибут на вызов вешать или еще как, который будет показывать, что я явно хочу вызвать нечистую функцию из чистой, и при этом данный вызов не нарушает чистоту.