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

Сообщение Re[93]: Мнение: объектно-ориентированное программирование — от 10.11.2019 19:34

Изменено 10.11.2019 19:53 AlexRK

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

S>>>Естественно, речь идет о первом приближении, но не о гарантии. И конечно, о степени доверия источнику деклараций.

ARK>>Разве есть вариант лучше? "Истинная чистота" это, конечно, хорошо, но что с нее толку.
S>Именно лишь с истинной можно брать какой-то толк. Декларируемая (при расхождении с истинной) будет приносить лишь вред.

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

S>>>Да, в хаскеле есть грязные функции. То же топорное FFI без заворачивания в IO — грязь. Помеченные как IO — это чистые функции, которые создают грязные action-ы, которые будут лить грязь исключительно при передачи управления им вместе с RealWorld.


ARK>>ОК. Введем терминологию:

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

Может. Это моим словам не противоречит.

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

S>Что такое "декларируемо чистый action", если в типе уже заложена трансформация мира?

Какая еще трансформация мира? "2 + 2" — это трансформация мира?

Func<int> MyFunc()
{
    return (() => 2 + 2);
}


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 — дает немедленную грязь.

Разницы нет. Смотри таблицу. "f();" — это и есть bind.

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

S>что такое декларируемо чистое действие?

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

S>>>Естественно, речь идет о первом приближении, но не о гарантии. И конечно, о степени доверия источнику деклараций.

ARK>>Разве есть вариант лучше? "Истинная чистота" это, конечно, хорошо, но что с нее толку.
S>Именно лишь с истинной можно брать какой-то толк. Декларируемая (при расхождении с истинной) будет приносить лишь вред.

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

S>>>Да, в хаскеле есть грязные функции. То же топорное FFI без заворачивания в IO — грязь. Помеченные как IO — это чистые функции, которые создают грязные action-ы, которые будут лить грязь исключительно при передачи управления им вместе с RealWorld.


ARK>>ОК. Введем терминологию:

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

Может. Это моим словам не противоречит.

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

S>Что такое "декларируемо чистый action", если в типе уже заложена трансформация мира?

Какая еще трансформация мира? "2 + 2" — это трансформация мира?

Func<int> MyFunc()
{
    return (() => 2 + 2);
}


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 — дает немедленную грязь.

Разницы нет. Смотри таблицу. "f();" — это и есть bind.

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

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

S>что такое декларируемо чистое действие?

См. выше.