Информация об изменениях

Сообщение Re[95]: Мнение: объектно-ориентированное программирование — от 11.11.2019 16:57

Изменено 11.11.2019 16:59 AlexRK

Re[95]: Мнение: объектно-ориентированное программирование —
Здравствуйте, samius, Вы писали:

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

S>Что значит, "никак не определишь"?

То и значит. Ты ее не определишь никак, от слова совсем. Причем принципиально, фундаментально, не определишь. Можно взять одну и ту же программу на хаскеле и запустить ее сперва в виртуальной машине, которая выводит на принтер хоста каждое изменение регистров. А потом запустить в другой виртуальной машине, которая блокирует на хосте все запросы на ввод-вывод. В первом случае КАЖДАЯ функция в программе будет грязной. Во втором случае КАЖДАЯ функция в программе будет чистой. Вопрос: каковы же функции в этой программе, грязные или чистые? Программа одна и та же.

S>Есть довольно большое кол-во функций, в чистоте которых просто не приходится сомневаться. Например, кому может в голову прийти засовывать грязь в вычисление синуса или проекцию последовательности? Мы и пользуемся ими, исходя из предположения, что использование таких функций не несет отражение в мире.


Предлагаешь перейти к вере? Представляешь, пишет Пифагор на своих скрижалях: я верю, что параллельные прямые не пересекаются. Мамой клянусь, сам видел. Нарисовал километр — не пересеклись. Значит, не пересекаются.

Увы, это так не работает. Есть только два варианта: либо ты постулируешь что-то аксиоматически, либо доказываешь на основе существующих аксиом и теорем. Все, третьего не дано. С чистотой аналогично: либо ты постулируешь чистоту функции, либо доказываешь ее. Вера и чуйка — это не инженерный подход.

S>Вот скажи, тебе нужны исходники логарифма или его документация, что бы убедиться в его чистоте?


"Истинную" чистоту (чистоту в твоем понимании) не определить никак, ни по исходникам, ни по документации. И лично мне она не нужна. Мне нужна декларативная чистота (обещание компилятора или стандарта языка): либо ключевое слово в исходниках, либо текст в документации. На веру я ничего не принимаю.

ARK>>>>1) IO-функция — декларируемо чистая функция, возвращающая декларируемо грязный action.

S>>>Функция, возвращающая грязный action может быть и грязной (если помимо возвращения она еще и пачкает), и чистой, причем, не декларируемо, а вполне.
ARK>>Может. Это моим словам не противоречит.
S>Противоречит. Ты обозначил что все функции IO декларируемо чистые, но я могу привести пример грязной функции, которая декларируемо чистая. Если оно не противоречит, то я не понимаю намерения от ввода декларируемой чистоты.

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

ARK>>>>Смотрим (синтаксис примерный, для иллюстрации):

ARK>>>>
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>|                                                     |     Haskell     |        С        |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Объявление IO-функции                               |      f IO       |   typename f()  |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание IO-функции в цепочку IO-вызовов         |      f >>=      |       f();      |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание IO-функции в цепочку любых вызовов      | unsafePerformIO |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Объявление обычной функции                          |        f        |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание обычной функции в цепочку любых вызовов |        f        |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>

ARK>>>>Видишь разницу между printf и putStr? Ее нет. Мы можем правомочно рассматривать обе функции как декларируемо чистые функции, возвращающие декларируемо грязное действие. И даже функцию main в С — тоже.
S>>>Разница есть. bind в хаскеле — чист. Вызов f() в C — дает немедленную грязь.
ARK>>Разницы нет. Смотри таблицу. "f();" — это и есть bind.
S>Вызов грязной функции не может быть bind-ом, т.к. bind не вызывает ничего, только связывает.

Ну а если абстрагироваться и представить, что "f();" — это не вызов, а связывание?

ARK>>UPD. Кстати, а с чего ты вообще взял, что "bind в хаскеле — чист"? Тебе кто-то сказал об этом, ты где-то прочитал об этом или, может, ты сам пытался проверить? Если пытался, то поясни, пожалуйста, каким образом ты заключил, что bind чист — вдруг он чист первые 100500 миллиардов вызовов, а потом дает грязь?

S>Ему нет нужды делать грязь, ровно как и синусу. Ну и исходники его на каждом углу. IO в хаскеле реализуется через монаду State, которая чиста как слеза.

"Вера" и "чуйка"? Исходники тебе ничего не дадут. Про чистоту монады State тоже вопрос открытый. Ты рассуждаешь о чистоте отдельных функций и понятий аксиоматически, не так ли? Это то, с чего я начал разговор, кстати.

ARK>>>>Разница между языками есть в том, что в хаскеле есть декларируемо чистые функции, возвращающие декларируемо чистое действие (это не что иное, как "обычные" ленивые не-IO функции).

S>>>что такое декларируемо чистое действие?
S>Что такое действие, почему ты обычные функции называешь действием? Синус — это действие?

ОК, действие не очень хороший термин, пусть будет просто "функция". Одна декларируемо чистая функция возвращает другую декларируемо чистую функцию.
Re[95]: Мнение: объектно-ориентированное программирование —
Здравствуйте, samius, Вы писали:

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

S>Что значит, "никак не определишь"?

То и значит. Ты ее не определишь никак, от слова совсем. Причем принципиально, фундаментально, не определишь. Можно взять одну и ту же программу на хаскеле и запустить ее сперва в виртуальной машине, которая выводит на принтер хоста каждое изменение регистров. А потом запустить в другой виртуальной машине, которая блокирует на хосте все запросы на ввод-вывод. В первом случае КАЖДАЯ функция в программе будет грязной. Во втором случае КАЖДАЯ функция в программе будет чистой. Вопрос: каковы же функции в этой программе, грязные или чистые? Программа одна и та же.

S>Есть довольно большое кол-во функций, в чистоте которых просто не приходится сомневаться. Например, кому может в голову прийти засовывать грязь в вычисление синуса или проекцию последовательности? Мы и пользуемся ими, исходя из предположения, что использование таких функций не несет отражение в мире.


Предлагаешь перейти к вере? Представляешь, пишет Пифагор тьфу ты, какой нафиг Пифагор, Евклид конечно на своих скрижалях: я верю, что параллельные прямые не пересекаются. Мамой клянусь, сам видел. Нарисовал километр — не пересеклись. Значит, не пересекаются.

Увы, это так не работает. Есть только два варианта: либо ты постулируешь что-то аксиоматически, либо доказываешь на основе существующих аксиом и теорем. Все, третьего не дано. С чистотой аналогично: либо ты постулируешь чистоту функции, либо доказываешь ее. Вера и чуйка — это не инженерный подход.

S>Вот скажи, тебе нужны исходники логарифма или его документация, что бы убедиться в его чистоте?


"Истинную" чистоту (чистоту в твоем понимании) не определить никак, ни по исходникам, ни по документации. И лично мне она не нужна. Мне нужна декларативная чистота (обещание компилятора или стандарта языка): либо ключевое слово в исходниках, либо текст в документации. На веру я ничего не принимаю.

ARK>>>>1) IO-функция — декларируемо чистая функция, возвращающая декларируемо грязный action.

S>>>Функция, возвращающая грязный action может быть и грязной (если помимо возвращения она еще и пачкает), и чистой, причем, не декларируемо, а вполне.
ARK>>Может. Это моим словам не противоречит.
S>Противоречит. Ты обозначил что все функции IO декларируемо чистые, но я могу привести пример грязной функции, которая декларируемо чистая. Если оно не противоречит, то я не понимаю намерения от ввода декларируемой чистоты.

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

ARK>>>>Смотрим (синтаксис примерный, для иллюстрации):

ARK>>>>
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>|                                                     |     Haskell     |        С        |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Объявление IO-функции                               |      f IO       |   typename f()  |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание IO-функции в цепочку IO-вызовов         |      f >>=      |       f();      |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание IO-функции в цепочку любых вызовов      | unsafePerformIO |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Объявление обычной функции                          |        f        |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>| Встраивание обычной функции в цепочку любых вызовов |        f        |   отсутствует   |
ARK>>>>|-----------------------------------------------------|-----------------|-----------------|
ARK>>>>

ARK>>>>Видишь разницу между printf и putStr? Ее нет. Мы можем правомочно рассматривать обе функции как декларируемо чистые функции, возвращающие декларируемо грязное действие. И даже функцию main в С — тоже.
S>>>Разница есть. bind в хаскеле — чист. Вызов f() в C — дает немедленную грязь.
ARK>>Разницы нет. Смотри таблицу. "f();" — это и есть bind.
S>Вызов грязной функции не может быть bind-ом, т.к. bind не вызывает ничего, только связывает.

Ну а если абстрагироваться и представить, что "f();" — это не вызов, а связывание?

ARK>>UPD. Кстати, а с чего ты вообще взял, что "bind в хаскеле — чист"? Тебе кто-то сказал об этом, ты где-то прочитал об этом или, может, ты сам пытался проверить? Если пытался, то поясни, пожалуйста, каким образом ты заключил, что bind чист — вдруг он чист первые 100500 миллиардов вызовов, а потом дает грязь?

S>Ему нет нужды делать грязь, ровно как и синусу. Ну и исходники его на каждом углу. IO в хаскеле реализуется через монаду State, которая чиста как слеза.

"Вера" и "чуйка"? Исходники тебе ничего не дадут. Про чистоту монады State тоже вопрос открытый. Ты рассуждаешь о чистоте отдельных функций и понятий аксиоматически, не так ли? Это то, с чего я начал разговор, кстати.

ARK>>>>Разница между языками есть в том, что в хаскеле есть декларируемо чистые функции, возвращающие декларируемо чистое действие (это не что иное, как "обычные" ленивые не-IO функции).

S>>>что такое декларируемо чистое действие?
S>Что такое действие, почему ты обычные функции называешь действием? Синус — это действие?

ОК, действие не очень хороший термин, пусть будет просто "функция". Одна декларируемо чистая функция возвращает другую декларируемо чистую функцию.