Re[114]: Мнение: объектно-ориентированное программирование —
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.11.19 14:05
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Здравствуйте, samius, Вы писали:


ARK>>>Мой поинт в том, что для рассуждений о чистоте — достаточно сигнатуры. Остальное проверить нельзя.


S>>Что скажешь о чистоте по одной лишь сигнатуре с учетом того, что printf "чистая"? Вероятно, тоже будет чистой.


ARK>В С/C++ нет сигнатуры, определяющей чистоту. Поэтому флагом чистоты может быть только документация. Если там сказано, что эта функция чистая — значит, чистая. Если не сказано — значит, мы должны подозревать грязь. Можно строить предположения о чистоте из других факторов, но это самый ненадежный способ, ибо это та самая "чуйка", проверить которую в общем случае нельзя.

То есть, одной сигнатуры недостаточно.

S>>>>Но это не определение, это лишь метка. Не метка делает функцию чистой или грязной.


ARK>>>Да, метка. Метки бывают разные, например "pure" или слово в документации. Прикол в том, что именно "метка" и определяет чистоту. Или что для тебя делает UnsafePerformIO грязным? Ты его "проверяешь"? Но не в виртуальной машине, ведь это нечестно?

S>>unsafePerformIO указывает на то, что функция с большой вероятностью либо берет данные из мира, либо кладет туда данные. Иначе зачем ей там быть?

ARK>Так unsafePerformIO грязен или нет?

Чисто теоретически это бэкдор, маркер. И только лишь. В сочетании с вычислениями, не делающими сайд-эффектов и не принимающими значения из мира, он будет чист. В сочетании с грязными вычислениями — грязен.
Но на практике он меняет окружение при выполнении. Пользуется примитивами синхронизации многопоточного окружения. В однопоточной программе вряд ли имеет смысл обращать на это внимание. Т.е. зависит от...

ARK>>>>>Так это то же самое же.

S>>>>Нет, т.к. результат вычисления твоей putStrLn1 нельзя закэшировать. Он void + грязь.
ARK>>>Почему, можно. Есть прямое преобразование к Action.
S>>преобразование к Action не выполняет код. Это не результат вызова. Это взятие "адреса".

ARK>Я о том, что можно "закешировать" результат Console.WriteLine через putStrLn1.

Кавычки должны быть минимум 24 шрифтом. И слово "закэшировать" не более чем 6-м.

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

ARK>>>Ну и вопросы, собственно, остались без ответа (выделено).
S>>Ты так и не дошел до википедии? Там есть статья, ссылка на странице чистоты функции.

ARK>В википедии, если не ошибаюсь, сказано об эффектах, которые видны окружению. Поправь, если я не прав. Стало быть, в подходящем окружении ввода-вывода не будет, даже если мы будем дергать соответствующие функции. Так?


Да, наверное, можно так сказать. Что в подходящем окружении можно не бояться определенных сайд-эффектов (или что для некого набора сайд-эффектов можно построить подходящее окружение, что сайд-эффекты не будут себя проявлять). Но что нам делать с тем, что программа должна написать нечто вычисленное в файл/консоль, что мы хотим увидеть? У нее же должно быть какое-то желаемое наблюдаемое поведение кроме вырожденного (никакого)? Стоит избавиться от всех сайд-эффектов, и программу можно даже не писать, не то что бы компилировать и запускать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.