Re[100]: Мнение: объектно-ориентированное программирование —
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.11.19 07:24
Оценка:
ARK>Мы это уже много раз проходили. Можно применить такую же модель для языка С и утверждать, что "printf не обращается к миру, а обращается к миру функция, возвращенная printf'ом в качестве результата".
Я же показал вроде, в чём разница между функциями, которые работают с миром, и функциями, которые работают с функциями, которые работают с миром.
Функция square по-прежнему является чистой, даже когда она возводит в квадрат грязную функцию. Например, результат square(sin, 10) можно кэшировать.

ARK>Если бы ты мог в коде на хаскеле "оторвать" саму putStr от функции, которую она возвращает (вызвать putStr, но не вызывать то, что она возвращает, или вызвать этот action потом и из другого места), то разница с С была бы. Но ты не можешь.


S>>Что же в этом бессмысленного?

ARK>Бессмысленно не это, а такое определение чистоты, которое невозможно проверить ("чистая функция не делает ввода-вывода"). Точнее, не оно само по себе бессмысленно, а бессмысленно его прямое применение в языках программирования.
Это определение проверить очень легко: если у функции нет в аргументах IO, то она никак не может делать ввода-вывода.
Наличие unsafePerformIO — это специальная штука, которая на наше понимание чистоты не влияет.
Примерно так же, как то, что глагол GET в HTTP является безопасным: он по дизайну не может иметь побочных эффектов.
На практике это работает несколько наоборот: иметь-то он эти эффекты, конечно же, может (а кто ему запретит?), вот только полагаться на них мы не можем.
То есть, к примеру, если, допустим, мы сделаем так, что GET возвращает нам JS-объект {"name":"sinclair", "visitCount":42}, и будем инкрементировать visitCount при каждом исполнении, то не надо плакать, когда от нажатия F5 в браузере счётчик не растёт. Потому, что инфраструктура считает глагол безопасным, и имеет право брать результат из кэша.

Так и тут — если мы хотим сделать версию синуса, которая логгирует все вызовы, то можно либо сделать внутри неё unsafePerformIO — и тогда у нас количество и порядок строчек лога не будет детерминировано, либо по-честному вмешать в её сигнатуру IO, и тогда придётся честно выписывать порядок вычислений при её использовании.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.