Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.168] |
|
Страницы: (11) « Первая ... 8 9 [10] 11 все ( Перейти к последнему сообщению ) |
Сообщ.
#136
,
|
|
|
А чем if constexpr не устраивает? Я, кстати, пока ни разу не пользовался, так что моё мнение может быть необъективным, но-таки заявлю, что коли зарубил, значит были причины. Концепты, вон, тоже зарубили в своё время, зато сейчас они выглядят логичнее и понятнее. Та и std::filesystem нонешный мне нравится куда как сильнее по сравнению с начальной редакцией, слизанной с буста. Зато спешка с принятием std::wstring_convert и std::wbuffer_convert сказалась весьма неприятно. Я поначалу вслед за Wound тоже был разочарован отказом от него, но проведя собственное "расследование", склоняюсь к тому, что буду скорее на стороне отмены.
Добавлено Цитата applegame @ Припоминаю спор о видах полиморфизма. Я там топил за то, что неважно, как оно реализовано в объектом коде, и единственно важно, как оно преподносится языком в его грамматике. Правда, уже не помню, чем кончилось. Можно, конечно скатываться в терминологическую демагогию, как это делаешь ты: ну типа раз в определении ИП написано "мутабельный", значит ответ очевиден: низзя. А на остальное насрать. Добавлено Цитата applegame @ Точно? Я бы определил императивность как метод, описывающий однозначную последовательность инструкций по получению результатов из входных данных. В отличие от декларативности, наиболее простым примером чего можно привести язык скриптов make. Одним из синонимом императивности является категоричность. По этому критерию ФП не ортогонально ИП, а является его более частным случаем, с дополнительными ограничительными методиками. Отсюда делаю. вывод: "конвенционально принятое" определение ИП устарело. Ключевое - это последовательность инструкций Добавлено Предлагаю перейти к решению квадратных уравнений. Добавлено Цитата scrambrella @ Ну вот, а вы на sergioK-а наезжаете. sergioK нормальный парень.Математически доказано, что невозможно проверить зависнет программа или нет. На этом можно остановиться. Ужос, правда? Добавлено Только его рассматривают не как декларацию иммутабельности, а как утверждение контракта. Как бы есть разница между гарантией и обещанием. Добавлено В догонку себе. Это следствие тех дополнительных качеств ФП, а не собственно базовое его отличие от ИП. Оно там просто всегда применимо. Я могу себе представить и в ИП то же самое, но конечно далеко не всегда, а в весьма частных случаях. Хотя тут от компилятора зависит, Intel C++, например, умеет раздербанивать всю программу целиком, и неважно, из скольких единиц трансляции она состоит. Запастись памятью и временем надо лишь. |
Сообщ.
#137
,
|
|
|
Цитата Qraizer @ Ну вот, а вы на sergioK-а наезжаете. sergioK нормальный парень. Цитата scrambrella @ 26 апреля, 10:41 Программа должна работать на компьютере, который не умеет считать? Ужос, правда? На работающем не могут правильно сделать расчёты. Плохой софт отправил работников почты за решетку https://habr.com/ru/company/itsoft/blog/554404/ Джанет Скиннер рассказывает, что её разлучили с двумя детьми на девять месяцев, в течение которых она находилась в тюрьме, после того, как Horizon показал недостачу в £59,000. Она также сообщает, что потеряла предложение о работе из-за своей судимости. Время, проведенное ею и другими в тюрьме, невозможно вернуть, и это произошло, потому что программе доверяли на слово. |
Сообщ.
#138
,
|
|
|
Цитата Qraizer @ Припоминаю спор о видах полиморфизма. Ссылка есть? Добавлено Цитата applegame @ По поводу Rust. А вот этот вот Cell - это же не конструкция языка, а элемент стандратной библиотеки. Он внутри unsafe? Да, Cell, RefCell и остальное юзают внутри unsafe. |
Сообщ.
#139
,
|
|
|
Сообщ.
#140
,
|
|
|
Цитата OpenGL @ Та где-то тут в Холиварах. Поди найди, при неработающем поиске-то. Ссылка есть? |
Сообщ.
#141
,
|
|
|
Цитата D_KEY @ Так это будут уже детали реализации. А нам важен код, а не реализация исполнителя этого кода.Так и в ИП без побочных эффектов это так же не имеет никакого значения. Можно сделать такую реализацию, которая будет проводить хитрые анализы и менять последовательность выполнения (будет иметь право, т.к. видимый результат не изменится). Цитата D_KEY @ Не исключаю, а делаю необязательным. Не надо искажать. Второй твой тезис неверен. В чистом ФП (идеальном) в коде нет явных промежуточных результататов, даже иммутабельных. Вот кусок программы на Haskell:Это имеет значение только если у тебя есть побочные эффекты и изменение состояния или одним вычислениям нужен результат других. Первый случай ты исключаешь по определению, второй присутствует в ФП. Цитата Может создаться ложное впечатление, что это последовательность из трех инструкций, аналогично, например этому коду в языке D:x = 3 y = x + 1 z = y + 2 const x = 3; const y = x + 1; const z = y + 2; Но тут нет никакой последовательности инструкций, тут даже в общем-то даже инструкций нет. Переменные не хранят промежуточных значений, поэтому можно переставлять строчки как угодно, ничего не меняется: Цитата В императивном коде такой фокус не прокатит.z = y + 2 y = x + 1 x = 3 В D в принципе возможно писать в аналогичном ФП-стиле при помощи лямбд: alias z = () => y() + 2; alias y = () => x() + 1; alias x = () => 3; Забавно, но в C/C++ это можно это сделать, используя макросы. Вот такое ФП (причем полиморфное, все по-взрослому ): #define z (y + 2) #define y (x + 1) #define x 3 Цитата D_KEY @ Не совсем понимаю, что значит "убираем изменение состояния на уровне семантики языка". Пример можно? В ИП промежуточные результяты создаются явно в коде, в виде переменных, в том числе иммутабельных. Если в коде явно не создавать промежуточных результатов, то наверное получится ФП. Если мы убираем побочные эффекты и изменение состояния (на уровне семантики языка), то это все становится лишь деталью реализации. Польза большая: нам не нужно знать чистые эти функции или нет, просто считаем, что инструкции выполняются друг за другом. Например в том же Erlang/Elixir вообще нет понятия чистоты функций. Они могут быть чистыми или грязными - пофиг. То же самое и в do-нотации Haskell. |
Сообщ.
#142
,
|
|
|
Цитата applegame @ Польза большая: нам не нужно знать чистые эти функции или нет Мы знаем, что они чистые. Цитата applegame @ То же самое и в do-нотации Haskell. В Хаскелле все функции чистые и do-нотация, как и монады, не имеют отношения к чистоте. |
Сообщ.
#143
,
|
|
|
А если так?
auto x = []{ return 3; }; auto y = []{ return x() + 1; }; auto z = []{ return y() + 2; }; |
Сообщ.
#144
,
|
|
|
Цитата korvin @ Если знаем, то ИП можно не применять. ИП полезно тем, что не нужно знать. Ты можешь знать если хочется, но тебе это не нужно, пусть об этом знает компилятор.Мы знаем, что они чистые. От твоего знания чистые это функции или нет ИП не превращается в ФП и наоброт. Парадигма кода зависит от семантики языка, и собственно самого кода. От твоего знания что функции bar и foo чистые, ИП код Цитата не станет внезапно ФП.immutable a = foo(x) if(a == 0) return 1; immutable a1 = a + bar(a); if(a1 == 1) return 2; return 3; Цитата korvin @ Не все. Иначе IO был бы просто невозможен.В Хаскелле все функции чистые Каждая IO-функция получает в качастве параметра, условное состояние внешнего мира, полученное из предыдущей IO-функции, делает IO и возвращает измененное состояние. НО! Если, допустим, функции чтения символа с клавиатуры подсунуть несколько раз одно и то же состояние мира, то она запросто может вернуть разные значения. Чтобы такого не происходило, в Хаскеле IO-функции вместе с сотоянием мира плотно завернуты в монаду, и остальные функции не имеют доступа к этому состоянию и, соответственно, не могут заставить IO-функцию вызваться с одним и тем же состоянием. Получается, что IO-функция как хитрожопый коррупционер: все знают что делишки грязные, но нет никакой возможности доказать это в рамках языка, формально все чисто. А все потому что все коррупционеры (IO-функции) в сговоре и никому, кроме как друг-другу, свои внутренние дела не раскрывают. Но они все равно с побочными эффектами, иначе порядок их вызова был бы не важен. Тем они и отличаются от обычных функций. Цитата korvin @ Да, монады упрощают построение цепочек вызовов функций со скрытым внутренним состоянием.и do-нотация, как и монады, не имеют отношения к чистоте. do-нотация имеет отношение к последовательности инструкций. Об этои говорит название нотации (do) и название её элементов (statements). Некоторые авторы пытаются зачем-то откреститься от этого. Например в пресловутой статье: https://wiki.haskell.org/Do_notation_considered_harmful написано: Цитата Что в общем случае является ложью. В качестве примера там берутся чистые функции. Но ведь если бы там были IO-функции с побочными эффектами, То the order of statements очень даже был бы the criterion for the evaluation order, при том что никаких явных data dependencies может вообще не быть. The order of statements is also not the criterion for the evaluation order. Also here only the data dependencies count. Добавлено Цитата Qraizer @ А если так? auto x = []{ return 3; }; auto y = []{ return x() + 1; }; auto z = []{ return y() + 2; }; Так не нужно. Вот если бы можно было так: auto z = []{ return y() + 2; }; auto y = []{ return x() + 1; }; auto x = []{ return 3; }; |
Сообщ.
#145
,
|
|
|
Цитата applegame @ не станет внезапно ФП. Почему это? Вот этот код тоже императивный: foo() + bar() + gee() + qux() ? А этот: foo() >> bar() >> gee() >> qux() ? Может, этот: foo() ; bar() ; gee() ; qux() ? Какой из этих примеров — чистая композиция функций (например, на Хаскелле), а какой — императивная последовательность statement'ов (например, на Паскале)? Цитата applegame @ Не все. Иначе IO был бы просто невозможен. IO не имеет отношения к языку. Они разделены. Цитата applegame @ do-нотация имеет отношение к последовательности инструкций. Об этои говорит название нотации (do) и название её элементов (statements). Не имеет. Тебе уже пример приводили. Цитата applegame @ Некоторые авторы пытаются зачем-то откреститься от этого. Например в пресловутой статье: https://wiki.haskell.org/Do_notation_considered_harmful написано: всего-то wiki на сайте языка, наполняемая и модерируемая сообществом хаскеллистов. При этом и Haskell Report не пишет ни о какой «последовательности инструкций». Цитата applegame @ Что в общем случае является ложью. Э нет, это чистая правда и просто факт. Но ты скатился до уровня Серёжи, ему тоже тыкали фактами в нос, а он продолжал витать в своих фантазиях. Цитата applegame @ Каждая IO-функция получает в качастве параметра, условное состояние внешнего мира, полученное из предыдущей IO-функции, делает IO и возвращает измененное состояние. НО! Если, допустим, функции чтения символа с клавиатуры подсунуть несколько раз одно и то же состояние мира, то она запросто может вернуть разные значения. Чтобы такого не происходило, в Хаскеле IO-функции вместе с сотоянием мира плотно завернуты в монаду, и остальные функции не имеют доступа к этому состоянию и, соответственно, не могут заставить IO-функцию вызваться с одним и тем же состоянием. Получается, что IO-функция как хитрожопый коррупционер: все знают что делишки грязные, но нет никакой возможности доказать это в рамках языка, формально все чисто. А все потому что все коррупционеры (IO-функции) в сговоре и никому, кроме как друг-другу, свои внутренние дела не раскрывают. Но они все равно с побочными эффектами, иначе порядок их вызова был бы не важен. Тем они и отличаются от обычных функций. а все другие монады, прячущие свои внутренности тоже в каком-то сговоре? Порядок «вызова» IO-функций задаётся обычной чистой функциональной композицией. Добавлено Цитата applegame @ Но ведь если бы там были IO-функции с побочными эффектами, То the order of statements очень даже был бы the criterion for the evaluation order Нет. Критерием вычисления является конкретная монада, используемая в do-выражении. |
Сообщ.
#146
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Так это будут уже детали реализации. А нам важен код, а не реализация исполнителя этого кода.Так и в ИП без побочных эффектов это так же не имеет никакого значения. Можно сделать такую реализацию, которая будет проводить хитрые анализы и менять последовательность выполнения (будет иметь право, т.к. видимый результат не изменится). Так в коде этого и не будет, если исходить из твоего определения. Не понимаю. Если нет побочных эффектов и изменения состояния, то последствательность выполнения инструкций важна лишь в контексте корректности вычислений, а значит, это ничем от ФП не отличается. Добавлено Цитата applegame @ Не исключаю, а делаю необязательным. Не надо искажать. Если ты не считаешь это необходимым условием, то мы его может вообще убрать для простоты рассмотрения. Цитата В чистом ФП (идеальном) в коде нет явных промежуточных результататов, даже иммутабельных Да почему это важно, если видимый результат никак от этого не зависит? Дальше ты опять скатываешься в языки, исходя из ложного предположения, что раз какой-нибудь C++ является императивным, то и любой код на нём отражает императивный стиль. Ну или я ошибаюсь, но тогда я вообще не понимаю, к чему твои примеры Добавлено Цитата applegame @ В императивном коде такой фокус не прокатит. Аналогом того кода на haskell в С++ будет: int x() { return 3; } int y() { return x() + 1 } int z() { return y() + 2; } Для перестановки достаточно заранее объявить функции: int x(); int y(); int z(); И инструкции тут ни при чем, это особенности областей видимости имен. |
Сообщ.
#147
,
|
|
|
Цитата korvin @ Потому что парадигма не может измениться если не меняется код Очевидно же.Почему это? Цитата korvin @ Последний - ИП, первые два ФП.Какой из этих примеров — чистая композиция функций (например, на Хаскелле), а какой — императивная последовательность statement'ов (например, на Паскале)? Цитата korvin @ Это тут причем? Ты сказал, что все функции в Хаскеле чистые. Раз возможно IO, значит возможны функции с побочными эффектами.IO не имеет отношения к языку. Они разделены. Цитата korvin @ Пример чего?Не имеет. Тебе уже пример приводили. Цитата korvin @ Опять апеллирование к авторитету. всего-то wiki на сайте языка, наполняемая и модерируемая сообществом хаскеллистов. При этом и Haskell Report не пишет ни о какой «последовательности инструкций». Цитата korvin @ Понеслась волшебная аргументация. Я не знаю как тебе уже объяснять. Если по-твоему вот тут результат не зависит от порядка стейтментов, то я хз кто тут больше похож на Сирожу Э нет, это чистая правда и просто факт. Но ты скатился до уровня Серёжи, ему тоже тыкали фактами в нос, а он продолжал витать в своих фантазиях. main = do putStrLn "str1" putStrLn "str2" Цитата korvin @ Откуда такой вывод? Почему все, если я говорил о хаскельном IO, в том числе и о монаде IO? а все другие монады, прячущие свои внутренности тоже в каком-то сговоре? Цитата korvin @ В чистой ФП-композиции порядок может быть любым, уже обсуждали и ты вроде согласился. Опять по кругу?Порядок «вызова» IO-функций задаётся обычной чистой функциональной композицией. Цитата korvin @ Ага, а то что эти критерии коррелируют с порядком стейтментов в do-нотации - это просто совпадение? Не думаю. Нет. Критерием вычисления является конкретная монада, используемая в do-выражении. Ладно, походу этот холивор порвался. Лично мне надоело. |
Сообщ.
#148
,
|
|
|
Функциональное и логическое программирование - единственно верные стили. ООП и ИП в топку. На С/С++ легко писать функционально.
|
Сообщ.
#149
,
|
|
|
Цитата D_KEY @ В общем ладно. Если ты тоже как и Корвин, считаешь, что парадигма этого кода зависит от чистоты функций bar и foo:Если ты не считаешь это необходимым условием, то мы его может вообще убрать для простоты рассмотрения. immutable a = foo(x) if(a == 0) return 1; immutable a1 = a + bar(a); if(a1 == 1) return 2; return 3; Делаем функции foo и bar чистыми, и опаньки - это ФП код, делаем с побочными эффектами и снова ИП Ну ок, оставайтесь при своем мнении. |
Сообщ.
#150
,
|
|
|
Цитата applegame @ Если по-твоему вот тут результат не зависит от порядка стейтментов, то я хз кто тут больше похож на Сирожу main = do putStrLn "str1" putStrLn "str2" Так зависит. Но ты убери синтаксический сахар из кода и посмотри, каким образом эта зависимость выражается на самом деле. |