Re[64]: Мнение: объектно-ориентированное программирование — катастрофа на трилли
От: AlexRK  
Дата: 28.10.19 06:37
Оценка: 36 (1) +1 -1
Здравствуйте, samius, Вы писали:

S>>>Программа может так же не дать и побочных эффектов. Но я говорил о сигнатуре. О типе результата.

ARK>>Вполне можно считать сигнатурой и типом результата функции main в С++ тем же computation<int>. Нет никаких оснований так не считать.
S>Раз, нет оснований, тогда считай. От меня нужно разрешение?

Ну ты с этим согласен? Если нет, то почему? Потому что в доках хаскеля написано, что "результат — это computation", а в доках С++ этого не написано? Так?

А если я форкну С++, назову язык "C++PURE" и изменю одну-единственную строчку в описании типа "функция", которая будет говорить, что "результат любой функции в С++ — это computation", то ты согласишься, что любые функции на этом языке будут совершенно чистыми, не грязнее хаскелевых? Компиляторы, я само собой, писать не буду, достаточно и текущих — ведь главное в документации сказать, что функция возвращает computation, и чистота придет сама собой.

S>>>Как это? Лично я затрудняюсь назвать побочные эффекты IO-функций в хаскеле, глядя на их сигнатуры. Ну вот, например, putStr принимает строку и возвращает IO(), который в свою очередь есть тип данных. В чем может заключаться её побочный эффект?

ARK>>В соответствии с определением, побочным эффектом является вызов системных функций ввода-вывода:
S>putStr не вызывает системных функций ввода-вывода.

Тогда printf в С++ тоже не вызывает системных функций ввода-вывода.

ARK>>То, что записано в сигнатуре хаскелевой функции — "IO" — это не "performing I/O", это просто метка. "Performing I/O" — это фактическое выполнение системных функций. И если вследствие "invoke" функции произойдет performing I/O, то эта функция — с побочными эффектами и, как следствие из предыдущего определения, нечистая. Таким образом, двусмысленное слово "evaluation" заменено на ровно такое же двусмысленное слово "invoke". По-прежнему различная трактовка слова "evaluation"/"invoke" приводит к противоположным результатам при попытке применить определение чистоты, данное в википедии.

S>invoke функции putStr не приводит к performing I/O.

А что тогда приводит к performing I/O? И почему "то, что приводит к performing I/O", не является "invoke"?

ARK>>Кстати, а вот есть черный ящик. Исполняемый файл. Он при запуске выводит на экран "Hello, World!". Программа, результатом компиляции которой стал этот файл, — чистая или нет?

S>Может быть чистой, как в случае с Haskell, может быть нет. В общем случае чистый исходный код программы не обязан компилироваться в чистый исполняемый файл. Как и наоборот.

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

Если это не мастурбация вприсядку, то что это тогда?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.