Здравствуйте, Sinclair, Вы писали:
ARK>>То и значит. Ты ее не определишь никак, от слова совсем. Причем принципиально, фундаментально, не определишь. Можно взять одну и ту же программу на хаскеле и запустить ее сперва в виртуальной машине, которая выводит на принтер хоста каждое изменение регистров. А потом запустить в другой виртуальной машине, которая блокирует на хосте все запросы на ввод-вывод. В первом случае КАЖДАЯ функция в программе будет грязной. Во втором случае КАЖДАЯ функция в программе будет чистой. Вопрос: каковы же функции в этой программе, грязные или чистые? Программа одна и та же.
S>Погодите, погодите. А что, интуитивно очевидный способ уже не работает? S>Делаем очень просто: S>1. Функция является грязной, если она принимает IO среди своих аргументов. S>2. Функция, вызывающая грязную, является грязной. S>Всё. Все остальные функции — грязные. S>Если бы мы работали с языком типа C, где мир доступен неявно — через static, global, и прочую аппаратуру, то нам пришлось бы подправить определения: S>1. Грязной является функция, которая обращается "к миру". S>2. Функция, вызывающая грязную, является грязной. S>Всё, все остальные функции грязные. Разница между языками — в том, что теперь нам необходимо изучать исходники для понимания того, какая функция грязная, а какая — нет. S>Альтернативой может стать включение ключевого слова pure в декларацию функции, а компилятор бы следил за выполнением п.1 и п.2.
Абсолютно верный, правильный и единственно разумный способ. Увы, мой собеседник не принимает такого подхода, поэтому я играю на его поле и пытаюсь продемонстрировать, что его подход является бессмысленным.