Re[103]: Мнение: объектно-ориентированное программирование —
От: AlexRK  
Дата: 13.11.19 06:56
Оценка:
Здравствуйте, samius, Вы писали:

S>>>Нет, не согласен. См. определение. Принимать IO — еще не грязь.

ARK>>Единственно разумный подход — считать, что это грязь. Это как раз о том, что говорит Sinclair. "Реальную грязь" ты не определишь никак, пишу это в очередной раз. Ты получишь разную картину для одной и той же функции в разных окружениях.
S>В соответствии с единственным разумных подходом (по твоей версии) выходит, что следующая функция в хаскеле грязная, т.к. может принимать IO:
S>
S>id x = x
S>


"Может принимать" и "всегда принимает/возвращает" — разные вещи. Если просто "может" — значит, эта функция ортогональна IO и грязной не является. А вот когда не МОЖЕТ, а ДОЛЖЕН — это уже другое дело.

S>>>Тем более, что putStr не принимает IO.

ARK>>Если в коде нет возможности отделить вызов функции от вызова того, что она возвращает, то эти вещи изоморфны друг другу.
S>Я бы не настаивал на том, что возможности нет, раз такая возможность используется для отделения чистоты от грязи.

Это и есть тот самый нехороший "трюк", с которого все и началось. Эта возможность существует только в воображении, она не реальна. Это как раз тот самый "онанизм вприсядку" (с), который позволяет создателям хаскеля именовать грязные функции чистыми. Оторви вызов action от вызова функции — и у меня не будет ни малейших претензий к чистоте putStr. Но создатели хаскеля не дураки — если бы это было реально так, то реализация была бы крайне тормозной. Поэтому они предпочитают морочить людям голову мнимой чистотой.

S>Ну и в конце концов — принимать IO и возвращать — не одно и то же. Или тут тоже проблема?


Увы. Если — и только если — возврат IO ("Action PutStr(string s)") неотделим от вызова грязного action, то он становится семантически полностью эквивалентным как приему-возврату грязного мира ("IO PutStr(IO world, string s)"), так и просто ключевому слову "dirty" в сигнатуре функции ("dirty void PutStr(string s)").

Кстати, продолжая: а если пометить все функции как "dirty", то мы получаем избыточность этого слова — оно становится не нужно, его можно исключить. И — вуаля! — мы получили С.

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

S>"Наша грязная функция" — вот это ты как определил? Ты меня убеди сначала, что она грязная. Хотя нет, давай сначала разберемся с критерием. А то у тебя выходит что id грязный, так нам чистоту putStr не получить.

ОК. Давай определимся с критерием. Ты согласен, что физически грязь можно получить, вызвав любую функцию (см. виртуальные машины)? Равно как и наоборот — можно физически НЕ получить грязь, вызвав любую функцию (все зависит от откружения, в котором функция запускается)?

Что же тогда называть "чистой функцией"? Я предлагаю вариант с ДЕКЛАРАЦИЕЙ чистоты (а не тем, что реально происходит при вызове): http://rsdn.org/forum/philosophy/7589812.1
Автор: AlexRK
Дата: 13.11.19

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