Re[9]: Pure keyword
От: AngeL B. Россия  
Дата: 16.03.10 08:23
Оценка:
Здравствуйте, 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-у, как его не назови.

P.S. Кстати, а как эту проблему в D решают?
Re[10]: Pure keyword
От: FR  
Дата: 16.03.10 08:27
Оценка:
Здравствуйте, AngeL B., Вы писали:


AB>P.S. Кстати, а как эту проблему в D решают?


В D два типа делегатов чистые и обычные, так что не скомпилируется, если я правильно понял.
Re[10]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.03.10 10:34
Оценка:
Здравствуйте, 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 нужен для передачи не чистой (или функции чистота которой не установлена) функции.
С чистыми все и так ясно. Сложность здесь скорее будет в том, что функции могут формироваться динамически (из кучи лямбд и замыканий).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Pure keyword
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.03.10 16:20
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Все функциональные типы передаваемые в чистую функцию обязаны быть чистыми.


Почему? А если эта функция просто добавляет данное значение в immutable список функций? Она вполне может быть чистой, даже если добавляемое значение (принимаемое в качестве аргумента) — функция с побочными эффектами.
Re[11]: Pure keyword
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.03.10 17:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Все функциональные типы передаваемые в чистую функцию обязаны быть чистыми.

VD>Тут вопрос стоит как это контролировать. Можно засунуть информацию о чистоте в тип функционального типа, а можно контролировать это дело только при вызове.

А как контролировать при вызове? Что делать, если функциональный аргумент — это результат вызова другого метода, или если он извлекается из коллекции (массива, списка и т.д.)? По-моему, без изменения системы типов тут не обойтись.
Re[12]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.10 18:00
Оценка:
Здравствуйте, nikov, Вы писали:

N>А как контролировать при вызове? Что делать, если функциональный аргумент — это результат вызова другого метода, или если он извлекается из коллекции (массива, списка и т.д.)?


Прослеживать цепочки вызовов. Чистый метод не может вернуть грязную лямбду если на вхоже у него тоже все чистое.
Массивы и переменные тоже нужно делить на чисты и грязные.

N>По-моему, без изменения системы типов тут не обойтись.


В прнципе можно, но пожалуй проще заложить данную информацию в тип. Проблема такого решения заключается в том, что ее придется кодировать в получаемых сборках и она будет доступна только для сборок созданных на этом же языке.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Pure keyword
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.03.10 18:03
Оценка:
Здравствуйте, VladD2, Вы писали:

N>>По-моему, без изменения системы типов тут не обойтись.


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


А вправе ли чистый метод кидать исключение?
Re[14]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.10 18:07
Оценка:
Здравствуйте, nikov, Вы писали:

N>А вправе ли чистый метод кидать исключение?


Если не страдать пароноей, то по-моему — да. Я рассматривю исключение как остановку вычислений и считаю их не приемлемыми для штатной передачи управления внтури кода.

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

В многопоточном окружении исключения весьма частый зверь. Так что без них никуда.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Pure keyword
От: VoidEx  
Дата: 21.03.10 21:54
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот ловить исключения — это несколько другой вопрос. Это можно и запретить. Тогда исключение внутри чистого кода будет по любому приводить управление в грязный код который имеет право делать все что ему взбредет в голову.


Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.
Re[16]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.10 22:30
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.


Ты чаем форумом не ошибся?

Просьба, недохаскели осбуждать где-нибудь в другом месте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Pure keyword
От: VoidEx  
Дата: 22.03.10 09:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, VoidEx, Вы писали:


VE>>Ну прямо Хаскель получается. Остаётся рассмотреть, как сделано в Хаскеле всё остальное, монаду IO убрать, а все чистые пометить Pure. Будет недохаскель с одной монадой.


VD>Ты чаем форумом не ошибся?

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

VD>Просьба, недохаскели осбуждать где-нибудь в другом месте.

Да где ж, как не здесь.
Re[18]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.10 12:20
Оценка:
Здравствуйте, VoidEx, Вы писали:

VD>>Просьба, недохаскели осбуждать где-нибудь в другом месте.

VE>Да где ж, как не здесь.

В Философии. На крайняк в Декларативном программировании.

А вообще, если нет чего сказать конструктивного, то можно и воздержаться. Лично мне на подобные выпады даже реагировать не хочется. Потратишь кучу времени на объяснение прописных истин и в итоге все равно ничего кроме флэйма не получишь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Pure keyword
От: Воронков Василий Россия  
Дата: 22.03.10 16:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ну, дык это иногда нужно. Скажем для логирования.


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