Re[2]: Pure keyword
От: nikov США http://www.linkedin.com/in/nikov
Дата: 13.03.10 21:24
Оценка: 1 (1) +2
Здравствуйте, Аноним, Вы писали:

А>Такой вопрос. Является ли эта функция pure?


А>
А>def isItPure() { System.DateTime.Now }
А>


Нет.
Re[2]: Pure keyword
От: hardcase Пират http://nemerle.org
Дата: 14.03.10 11:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Такой вопрос. Является ли эта функция pure?


А>
А>def isItPure() { System.DateTime.Now }
А>


Нет не является. Чистая функция это такая, функция результат которой зависит исключительно от переданных ей параметров.
У этой функции нет аргументов, но результат вызова каждый раз разный.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Pure keyword
От: AngeL B. Россия  
Дата: 14.03.10 14:06
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Нет не является. Чистая функция это такая, функция результат которой зависит исключительно от переданных ей параметров.


а такая?
def isItPure( act : void->int ) { act(); 1; }
?
Re[4]: Pure keyword
От: alvas  
Дата: 14.03.10 14:57
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>а такая?

AB>def isItPure( act : void->int ) { act(); 1; }
AB>?

И такая тоже нет
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[5]: Pure keyword
От: WolfHound  
Дата: 14.03.10 15:14
Оценка:
Здравствуйте, alvas, Вы писали:

AB>>а такая?

AB>>def isItPure( act : void->int ) { act(); 1; }
AB>>?
A>И такая тоже нет
Это зависит от того является ли act pure или нет.
А чтобы четко отделить мух от катлет нам придется завести 2 типа функций...
Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Pure keyword
От: AngeL B. Россия  
Дата: 14.03.10 16:22
Оценка: +2
Здравствуйте, alvas, Вы писали:

AB>>def isItPure( act : void->int ) { act(); 1; }

A>И такая тоже нет

вот если такая тоже нет, то функции filter, map, reduce перестают быть pure. Все функции, которые их вызывают тоже и ценность идеи начинает асимптотически приближаться к нулю.
Re[6]: Pure keyword
От: AngeL B. Россия  
Дата: 14.03.10 16:36
Оценка:
Здравствуйте, WolfHound, Вы писали:

AB>>>а такая?

AB>>>def isItPure( act : void->int ) { act(); 1; }
AB>>>?
A>>И такая тоже нет
WH>Это зависит от того является ли act pure или нет.
WH>А чтобы четко отделить мух от катлет нам придется завести 2 типа функций...
WH>Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.

или (идиотски хихикает) компилить для функций c лямбда-параметрами два варианта кода, один на случай pure (с параллельностью и прочей фигней) и один на случае 'не pure' для остальных вызовов.
Pure-ость лямбд может быть получиться выявить на этапе компиляции, а просто функции помечать.

А вдруг
Re[6]: Pure keyword
От: alvas  
Дата: 14.03.10 16:44
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>>>def isItPure( act : void->int ) { act(); 1; }

A>>И такая тоже нет

AB>вот если такая тоже нет, то функции filter, map, reduce перестают быть pure. Все функции, которые их вызывают тоже и ценность идеи начинает асимптотически приближаться к нулю.


Как я понимаю ваш пример = какое бы значение ваша функция не получила в виде параметра она всегда возвращает единицу.

Мое мнение
def isItPure() { 1; } — чистая
def isItPure( act : void->int ) { act(); } — чистая
def isItPure( act : void->int ) { act(); 1; } — нет
def isItPure( act) { 1; } — нет

Прокоментируйте, пожалуйста.
http://alvas.net — Аудио-инструменты для .Net разработчиков
Re[4]: Pure keyword
От: para  
Дата: 14.03.10 17:12
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>а такая?

AB>def isItPure( act : void->int ) { act(); 1; }
AB>?

думаю надо типа того:
PureDelegate[...] : Delegaete[...], IPure
...

def isItPure( act : void->int ) 
requires act is pure //IPure
{ 
  act(); 
  1
}
Re[7]: Pure keyword
От: Jack128  
Дата: 14.03.10 17:22
Оценка:
Здравствуйте, alvas, Вы писали:

A>Здравствуйте, AngeL B., Вы писали:


AB>>>>def isItPure( act : void->int ) { act(); 1; }

A>>>И такая тоже нет

AB>>вот если такая тоже нет, то функции filter, map, reduce перестают быть pure. Все функции, которые их вызывают тоже и ценность идеи начинает асимптотически приближаться к нулю.


A>Как я понимаю ваш пример = какое бы значение ваша функция не получила в виде параметра она всегда возвращает единицу.


A>Мое мнение

A>def isItPure() { 1; } — чистая
A>def isItPure( act : void->int ) { act(); } — чистая
A>def isItPure( act : void->int ) { act(); 1; } — нет
A>def isItPure( act) { 1; } — нет

A>Прокоментируйте, пожалуйста.


даже уже все сказали ( http://rsdn.ru/forum/nemerle/3734760.1.aspx
Автор: WolfHound
Дата: 14.03.10
)

1 и 4ый варинат — всегда чистые,
если act — чистая то 2ой и 3ий варианты тоже чистые, иначе — грязные..
Re[7]: Pure keyword
От: AngeL B. Россия  
Дата: 14.03.10 18:40
Оценка:
Здравствуйте, alvas, Вы писали:

A>Мое мнение

A>def isItPure() { 1; } — чистая
A>def isItPure( act : void->int ) { act(); } — чистая
A>def isItPure( act : void->int ) { act(); 1; } — нет
A>def isItPure( act) { 1; } — нет
A>Прокоментируйте, пожалуйста.

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

отсюда, как уже сказали
Автор: Jack128
Дата: 14.03.10
, вытекает, что 1) и 4) — чистые функции
а вот с 2) и 3) ситуация такова, что для обеспечения чистоты функции isItPure необходимо, чтобы чистой была и функция act(), т.к. если последняя грязная, то сама isItPure производит побочный эффект (путем вызова act()) и считаться чистой не может. Отсюда вывод — для обеспечения чистоты функции необходимо, чтобы ее собственный код был чистым, а также чтобы чистым был код всех вызываемых ею функций/лямдб/делегатов.
Отсюда очевидно вытекает, что для того чтобы isItPure можно было считать чистой в языках со строгой типизацией, параметр act должен быть помечен как чистый, а "чистота" его значения при вызове isItPure должна быть верифицируема компилятором. Следовательно необходимо иметь отдельно делегаты и отдельно "чистые делегаты" — которые должны быть совместимы в одну сторону как это сказано здесь
Автор: para
Дата: 14.03.10
.
Хотя лично мне такой вариант не очень нравиться.
Re[5]: Pure keyword
От: AngeL B. Россия  
Дата: 14.03.10 18:47
Оценка:
Здравствуйте, para, Вы писали:

P>PureDelegate[...] : Delegaete[...], IPure


а зачем у тебя интерфейс используется?
Re[6]: Pure keyword
От: para  
Дата: 14.03.10 18:54
Оценка:
Здравствуйте, AngeL B., Вы писали

P>>PureDelegate[...] : Delegaete[...], IPure


AB>а зачем у тебя интерфейс используется?


что-то замудрил
надо быть проще:
PureDelegate[...] : Delegaete[...]
...
def isItPure( act : pure void->int ) //(act : PureDelegate[void, int])
{ 
  act(); 
  1
}

хотя может когда-нибудь и понадобится интерфейс...
я думаю все эти идеи надо бы в snippets положить и хорошенько обдумать много аспектов..
Re[4]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.10 19:59
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>а такая?

AB>def isItPure( act : void->int ) { act(); 1; }
AB>?

А эта чистая. Только бессмысленная, так как возвращаемое значение act теряется. Учитывая, что для общей чистоты act обязана так же быть чистой функцией, приведенный код является глупостью.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.10 20:00
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

AB>>>а такая?

AB>>>def isItPure( act : void->int ) { act(); 1; }
AB>>>?
A>>И такая тоже нет
WH>Это зависит от того является ли act pure или нет.

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

WH>А чтобы четко отделить мух от катлет нам придется завести 2 типа функций...

WH>Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.

Для качественной реализации — да. А так в общем-то можно и по месту контролировать.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.10 20:03
Оценка:
Здравствуйте, AngeL B., Вы писали:

AB>при этом не важно действительно ли ее результат основывается на параметрах или нет.


Важно. Просто когда функция для любых аргументов всегда возвращает одно значение, то это все равно одно и то же значение для конкретных параметров. Так что все ОК.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Pure keyword
От: WolfHound  
Дата: 14.03.10 20:47
Оценка: +1 -1
Здравствуйте, VladD2, Вы писали:

VD>Даже не зависит. Сама функция чистая. А то что ей в качестве параметров может быть передана не чистая функция — это уже вопрос отдельный.

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

VD>Для качественной реализации — да.

А делать не качественно толку нет.

VD>А так в общем-то можно и по месту контролировать.

Угу и получится решето типа const в С++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Pure keyword
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.10 20:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Нет. Не отдельный.

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

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

VD>>Для качественной реализации — да.

WH>А делать не качественно толку нет.

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

VD>>А так в общем-то можно и по месту контролировать.

WH>Угу и получится решето типа const в С++.

Не получится. В С++ есть две проблемы. Они 1) контролирую не совсем то что нужно, 2) допускают обход системы типов (не безопасные приведения типов). Первое — это вопрос реализации. Второго Немерле не допускает априори.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Pure keyword
От: VoidEx  
Дата: 14.03.10 21:02
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

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


VD>>Даже не зависит. Сама функция чистая. А то что ей в качестве параметров может быть передана не чистая функция — это уже вопрос отдельный.

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

Тогда функция, возвращающая список из 1000 единиц тоже грязная.
Термин "побочный эффект" не определён, а вот чистота — вполне.
Re[6]: Pure keyword
От: hardcase Пират http://nemerle.org
Дата: 14.03.10 21:57
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.


В итоге изобретем частный случай Хаскеля.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.