Здравствуйте, samius, Вы писали:
S>>>Погодите, погодите. А что, интуитивно очевидный способ уже не работает? S>>>Делаем очень просто: S>>>1. Функция является грязной, если она принимает IO среди своих аргументов. S>>>2. Функция, вызывающая грязную, является грязной. S>>>Всё. Все остальные функции — грязные.
ARK>>Абсолютно верный, правильный и единственно разумный способ. Увы, мой собеседник не принимает такого подхода, поэтому я играю на его поле и пытаюсь продемонстрировать, что его подход является бессмысленным.
S>Я абсолютно согласен с таким подходом. Если функция обращается к миру — она грязная.
Не "если функция обращается к миру", а "если функция принимает IO среди своих аргументов" (из чего следует аксиоматически заданная грязь для встроенных функций). Ты согласен с этим подходом? По-моему, ты все это время настаиваешь на подходе "функция грязная, если она _реально_ выполняет ввод-вывод".
S>Но тут есть нюанс. putStr не обращается к миру, следовательно она сама не грязная в соответствии с таким подходом. Обращается к миру функция, возвращенная putStr-ом в качестве результата. Она — грязная.
Мы это уже много раз проходили. Можно применить такую же модель для языка С и утверждать, что "printf не обращается к миру, а обращается к миру функция, возвращенная printf'ом в качестве результата".
Если бы ты мог в коде на хаскеле "оторвать" саму putStr от функции, которую она возвращает (вызвать putStr, но не вызывать то, что она возвращает, или вызвать этот action потом и из другого места), то разница с С была бы. Но ты не можешь.
S>Что же в этом бессмысленного?
Бессмысленно не это, а такое определение чистоты, которое невозможно проверить ("чистая функция не делает ввода-вывода"). Точнее, не оно само по себе бессмысленно, а бессмысленно его прямое применение в языках программирования.