Здравствуйте, 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
Если такой вариант трактовки чистоты ты считаешь неправильным, то назови с твоей точки зрения правильный. Еще раз напомню, что вариант "чистая функция — которая не делает ввод-вывод" может быть легко фальсифицирован с помощью подделки окружения, в котором эта функция вызывается.