Andrew
Да, и апликативами
IC
В монадах магии нет потому что она в апликативах :3
доня.
f . g . h ?
ещё чуть добавлю f _ = 42 g x = x + 1 h x = x * x в каком порядке будет вычислено f . g . h $ 666?
Dmitry
Ну я мог бы и для C++ подобное написать, там благодаря компилятору и инлайнингу тоже всё запутается
Andrew
(f (g (h 666))) в таком
Dmitry
Вообще, что значит "порядок вычислений" ?
доня.
(f (g (h 666))) в таком
да нет, оно должно средуцироваться до 42 ещё во время компиляции зачем вычислять g(h(666)) если оно не используется?
Andrew
да, так
Andrew
я не понял к чему вопрос только))
доня.
в каком порядке произойдёт 1 событие? в любом
ну не придирайся, там человек сказал типа когда мы композим функции мы определяем порядок их вычисления
доня.
не должно, но может
ну вот по сути я к тому и веду, что мы не думаем в категориях «сначала будет применена первая функция, потом вторая, потом третья»
доня.
мы просто композируем маппинги, как оно там внутри будет вычисляться это работа компилятора
Oleg
нет я не хотел придраться, это же так и есть. Это значит что Maybe и остальные являются монадами и функторами. Разве не так?
вот есть куча каких-то штук, допустим типов есть класс этих штук, если штука относится к классу, мы иногда, если там захочется сломать язык, можем сказать, что эта штука - экземпляр этого класса чем тогда отличаются выражения "эта штука - монада" и "эта штука принадлежит классу монад"? Т.е. в общем, я согласен, что можно с большими оговорками говорить "IO - не монада, для IO есть экземпляр монады". Заметьте это отличается от поправки "IO - экземпляр монады" Здесь мы рассматриваем "экземпляр монады" как зависимую пару - тип и структура к нему, или "словарь тайпкласса" Но в большом количесте книжек по теортипам упоминается, что если вот эта дополнительная структура, т.е. "словарь тайпкласса" снабжена irrelevance, т.е. доказательством эквивалентности двух разных структур для одного объекта, что нам даёт когерентность тайплкссов, мы вполне можем говорить о "подтипах" или "подкласса" ,в этом случае Monad - это подтип "* -> *"
Cheese
как IO может не быть монадой? чушь какая-то. мы же говорим «числа являются группой по сложению»
Oleg
В таком случае мы вполне можем утверждать, что IO является монадой, в том случае, если построима доп-структура, требуемая определением монады для неё
Oleg
Поэтому я совершенно не понимаю, как можно сказать сначала "IO - не монада", а потом дополнить это "IO - экземпляр Monad"
Dmitry
ну не придирайся, там человек сказал типа когда мы композим функции мы определяем порядок их вычисления
В императивных языках тоже порядок вычислений перепутывается компилятором для большей эффективности
Dmitry
И та тоже можно было бы ожидать "42" на этапе компиляции
Dmitry
Ну, если те функции переписать на имп.языке
Denis
Ооооо, даже в этом чате монадные войны идут...
доня.
Поэтому я совершенно не понимаю, как можно сказать сначала "IO - не монада", а потом дополнить это "IO - экземпляр Monad"
ну окей, я утрировал конечно, просто хотел сказать что когда пытаешься объяснить что-то человеку малознакомому с хаскелем и всей этой вашей функциональщиной, нужно строго отделять свойства той же IO от того что она является монадой (реализует Monad, как угодно)
zool
Кстати godbolt.org поддерживает haskell. Там можно посмотреть результат компиляции
Denis
> "IO - не монада, IO - экземпляр Monad" Поправка уровня "IO - не монада, IO - конструктор типа..."
Denis
😂
Cheese
И та тоже можно было бы ожидать "42" на этапе компиляции
в С/С++, кстати, компилятор должен вычислять во время компиляции все выражения определенного вида (арифметические и constexpr)
доня.
И та тоже можно было бы ожидать "42" на этапе компиляции
но внезапно может оказаться что одна из этих функций печатает что-то в консоль, изменяет глобальную переменную или ещё что-то то есть функции уже не являются тупо маппингами одних значений в другие
Denis
Поэтому я совершенно не понимаю, как можно сказать сначала "IO - не монада", а потом дополнить это "IO - экземпляр Monad"
Да это просто прикол такой. Монады - это неиссякаемый источник шуток, мемов и холиваров.
Dmitry
Ооооо, даже в этом чате монадные войны идут...
Давайте трансформируем нашу монадовойну к исходной войне на тему "что такое декларативные языки программирования"
Dmitry
И является ли Haskell императивным
доня.
Давайте трансформируем нашу монадовойну к исходной войне на тему "что такое декларативные языки программирования"
описываешь последовательные шаги вычислений = код императивный описываешь маппинги между значениями = код декларативный
Cheese
Давайте трансформируем нашу монадовойну к исходной войне на тему "что такое декларативные языки программирования"
нет декларативных языков, есть декларативный код и языки, на которых можно писать декларативный код
Dmitry
Во!
Dmitry
Поддерживаю
Denis
Да, мы _можем_ писать на Хаскеле императивно.
Denis
но не хотим :-)
Cheese
И является ли Haskell императивным
очевидно, на Хаскеле можно писать императивный код
Denis
как правило
Cheese
описываешь последовательные шаги вычислений = код императивный описываешь маппинги между значениями = код декларативный
можно ещё так разделить: если при чтении кода надо у себя в голове его исполнять, это императивный код, если не надо — декларативный
доня.
ну если уж совсем занудствовать, то можно сказать, что на хаскеле мы пишем полностью декларативную программу результатом которой является императивная программа
Андрей
очевидно, на Хаскеле можно писать императивный код
только если мвар-ами обмазаться, наверно
Denis
ну да
Denis
или IORef
Oleg
описываешь последовательные шаги вычислений = код императивный описываешь маппинги между значениями = код декларативный
Ну вот ты, как человек, который там в параллельном чате задрачивает линейно-зависимые с Кришнасвами, полагаешь, что "последовательные шаги вычислений" - это прям-таки так легко определимое понятие?
Cheese
только если мвар-ами обмазаться, наверно
не только. есть целый вагон разных варов, в том числе MonadState и ST
Андрей
а так, если рассуждать, то хаскель появился чтобы не писать императивно )
Denis
👍
Dmitry
Именно для этого?
Denis
в том числе для этого
Oleg
а так, если рассуждать, то хаскель появился чтобы не писать императивно )
Ща ты нарвёшься, придёт А64 и расскажет тебе в который раз для чего появился хачкел
Oleg
ну всё ты огребаешь
Андрей
Aleksei (astynax)
Для обкатывания на нём идеек же
Denis
Ща ты нарвёшься, придёт А64 и расскажет тебе в который раз для чего появился хачкел
Да Хаскель это вообще шутка, а не язык. Первая же версия его когда вышла? 1 апреля 1990 года. Понимаете? Хаскель - это одна большая первоапрельская шутка. 😂
доня.
подпадает под императив
но с другой стороны зачастую порядок редукции не важен же, императив ли?
доня.
просто разворачиваешь определение
Oleg
А это где?
не скажу, задолбали набигать
доня.
кек
Cheese
но с другой стороны зачастую порядок редукции не важен же, императив ли?
для императивности важно наличие исполнителя, а не порядок, имхо
Oleg
для императивности важно наличие исполнителя, а не порядок, имхо
Обычно говорят о линеаризуемом стейте, так что порядок нельзя сбрасывать со счетов
Cheese
Обычно говорят о линеаризуемом стейте, так что порядок нельзя сбрасывать со счетов
для целей отличения декларативности от императивности обычно не говорят о линеаризуемом стэйте
A64m
@A64m_qb0 для чего появился хачкел?
для чего появился, или для чего авторами предполагалось его применять?
Андрей
😄 сам вопрос уже наброс
Oleg
для целей отличения декларативности от императивности обычно не говорят о линеаризуемом стэйте
Википедия утверждает, что In computer science, imperative programming is a programming paradigm that uses statements that change a program's state.
A64m
ну наверное второе
для всего, тут недостатка амбиций не было