Здравствуйте, Аноним, Вы писали:
А>Такой вопрос. Является ли эта функция pure?
А>
А>def isItPure() { System.DateTime.Now }
А>
Нет не является. Чистая функция это такая, функция результат которой зависит исключительно от переданных ей параметров.
У этой функции нет аргументов, но результат вызова каждый раз разный.
Здравствуйте, hardcase, Вы писали:
H>Нет не является. Чистая функция это такая, функция результат которой зависит исключительно от переданных ей параметров.
Здравствуйте, 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) А. Эйнштейн
Здравствуйте, alvas, Вы писали:
AB>>def isItPure( act : void->int ) { act(); 1; } A>И такая тоже нет
вот если такая тоже нет, то функции filter, map, reduce перестают быть pure. Все функции, которые их вызывают тоже и ценность идеи начинает асимптотически приближаться к нулю.
Здравствуйте, WolfHound, Вы писали:
AB>>>а такая? AB>>>def isItPure( act : void->int ) { act(); 1; } AB>>>? A>>И такая тоже нет WH>Это зависит от того является ли act pure или нет. WH>А чтобы четко отделить мух от катлет нам придется завести 2 типа функций... WH>Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.
или (идиотски хихикает) компилить для функций c лямбда-параметрами два варианта кода, один на случай pure (с параллельностью и прочей фигней) и один на случае 'не pure' для остальных вызовов.
Pure-ость лямбд может быть получиться выявить на этапе компиляции, а просто функции помечать.
Здравствуйте, AngeL B., Вы писали:
AB>>>def isItPure( act : void->int ) { act(); 1; } A>>И такая тоже нет
AB>вот если такая тоже нет, то функции filter, map, reduce перестают быть pure. Все функции, которые их вызывают тоже и ценность идеи начинает асимптотически приближаться к нулю.
Как я понимаю ваш пример = какое бы значение ваша функция не получила в виде параметра она всегда возвращает единицу.
Здравствуйте, 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>Прокоментируйте, пожалуйста.
хотя уже ответили, на всякий случай прокомментирую.
в двух словах, чистая функция — это функция результат которой зависит только от элементов, определенных внутри функции (включая параметры), и при этом функция ничего не меняет вовне себя.
при этом не важно действительно ли ее результат основывается на параметрах или нет. Если результат константа, параметры не задействованы, но побочных эффектов нет, то функция чистая.
это раз.
, вытекает, что 1) и 4) — чистые функции
а вот с 2) и 3) ситуация такова, что для обеспечения чистоты функции isItPure необходимо, чтобы чистой была и функция act(), т.к. если последняя грязная, то сама isItPure производит побочный эффект (путем вызова act()) и считаться чистой не может. Отсюда вывод — для обеспечения чистоты функции необходимо, чтобы ее собственный код был чистым, а также чтобы чистым был код всех вызываемых ею функций/лямдб/делегатов.
Отсюда очевидно вытекает, что для того чтобы isItPure можно было считать чистой в языках со строгой типизацией, параметр act должен быть помечен как чистый, а "чистота" его значения при вызове isItPure должна быть верифицируема компилятором. Следовательно необходимо иметь отдельно делегаты и отдельно "чистые делегаты" — которые должны быть совместимы в одну сторону как это сказано здесь
А эта чистая. Только бессмысленная, так как возвращаемое значение act теряется. Учитывая, что для общей чистоты act обязана так же быть чистой функцией, приведенный код является глупостью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
AB>>>а такая? AB>>>def isItPure( act : void->int ) { act(); 1; } AB>>>? A>>И такая тоже нет WH>Это зависит от того является ли act pure или нет.
Даже не зависит. Сама функция чистая. А то что ей в качестве параметров может быть передана не чистая функция — это уже вопрос отдельный.
WH>А чтобы четко отделить мух от катлет нам придется завести 2 типа функций... WH>Короче чтобы сделать все по уму придется как следует надругаться нат системой типов.
Для качественной реализации — да. А так в общем-то можно и по месту контролировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AngeL B., Вы писали:
AB>при этом не важно действительно ли ее результат основывается на параметрах или нет.
Важно. Просто когда функция для любых аргументов всегда возвращает одно значение, то это все равно одно и то же значение для конкретных параметров. Так что все ОК.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Даже не зависит. Сама функция чистая. А то что ей в качестве параметров может быть передана не чистая функция — это уже вопрос отдельный.
Нет. Не отдельный.
Если вызов функции приводит к побочным эффектам то вункция грязная.
VD>Для качественной реализации — да.
А делать не качественно толку нет.
VD>А так в общем-то можно и по месту контролировать.
Угу и получится решето типа const в С++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Нет. Не отдельный. WH>Если вызов функции приводит к побочным эффектам то вункция грязная.
Отдельный, отдельный. К побочным эффектам приводит не сама функция, а то что ей передают в качестве параметра. Так что достаточно в месте вызова проверить, то что параметры передаваемые чистой функции так же чистые.
VD>>Для качественной реализации — да. WH>А делать не качественно толку нет.
Не то что бы реализация без изменения типов будет не качественной. Просто контроль будет происходить на другой стадии — на стадии вызова.
VD>>А так в общем-то можно и по месту контролировать. WH>Угу и получится решето типа const в С++.
Не получится. В С++ есть две проблемы. Они 1) контролирую не совсем то что нужно, 2) допускают обход системы типов (не безопасные приведения типов). Первое — это вопрос реализации. Второго Немерле не допускает априори.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, VladD2, Вы писали:
VD>>Даже не зависит. Сама функция чистая. А то что ей в качестве параметров может быть передана не чистая функция — это уже вопрос отдельный. WH>Нет. Не отдельный. WH>Если вызов функции приводит к побочным эффектам то вункция грязная.
Тогда функция, возвращающая список из 1000 единиц тоже грязная.
Термин "побочный эффект" не определён, а вот чистота — вполне.