Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10

Нужны ли монады в C++?

03.08.2015, 21:50. Показов 5822. Ответов 63

Студворк — интернет-сервис помощи студентам
Всем привет.
Наверняка всем вам известен такой ресурс как Habrahabr.
Так вот. Не так давно я случайно наткнулся на одну интересную тему под названием "Монады и do-нотация в C++" (link).
Честно говоря, до этого я не знал что такое монады, но после прочтения темы у меня сложилось впечатление что лучше бы я их и не знал.
Дело не в том что это что-то страшное и сложное, просто мне кажется что использование монад в C++ лишь усложняет код. Люди же в некоторых комментариях считают иначе.
А что считаете вы? В каких ситуациях монады могут облегчить чтение кода или повысить его производительность?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2015, 21:50
Ответы с готовыми решениями:

Монады
Итак, в процессе решения одной задачки, мне понадобилось написать свою монаду... Не вдаваясь в подробности, скажу, что своё непонимание я...

Стейты, Монады
Приветствую любителей Скалы и функционального программирования. Пришли к нам в институт людишки из Тинькоффа продвигать Скалу, заняли...

Палиндромы и монады
Добрый вечер, уважаемые пользователи. У меня такая задача: "Ввести строку символов. Вывести в файл все палиндромы строки (использовать...

63
06.08.2015, 19:18  [ТС]
Студворк — интернет-сервис помощи студентам

Не по теме:

FraidZZ, да ну нет.

Эту
Название: FraidZZ.jpg
Просмотров: 129

Размер: 24.8 Кб
:D

0
06.08.2015, 19:42

Не по теме:

Цитата Сообщение от FraidZZ Посмотреть сообщение
301 Moved Permanently, внезапно, на всё тот же donsbot.wordpress.com
Забавно, похоже у меня провайдер блочит какой-то из wordpress'овских IP или эту страницу, добавил в friGate, заработало.

0
06.08.2015, 19:50

Не по теме:

Цитата Сообщение от korvin_ Посмотреть сообщение
Забавно, похоже у меня провайдер блочит какой-то из wordpress'овских IP или эту страницу, добавил в friGate, заработало.
Да, в ЗенМейте тоже открылось.
Хотел посмотреть в реестре блокировк - тот сбросил соединение секунд через 30 после отправки запроса :D

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.08.2015, 08:26
Попробуй кратно и просто сначала объяснить, что это такое и зачем нужно. Не можешь? Значит они и тебе то не нужны. Ну хотябы найди готовое описание. Простое, понятноное и не требующее рассуждений ни о всяких там кривонациях, хоть до, хоть я, хоть ре, хоть вообще ми, ни о загадочных тайп-классах. И при этом не сводящееся к мухлежу другими языками и не требующее их полного освоения для понимания сути конкретной языковой конструкции. Нет такого? Значит они не нужны, а то, для чего они якобы предназначены, проще сделать по-другому, чем изучать сами монады.

Добавлено через 13 минут
Эта функция извлекает значение из объекта ma, подставляет в функцию f и возвращает результат f.
Всего то? Оболочечные функции вообще не требуют ни каких специальных языковых конструкций, кроме одной - язык должен поддерживать функции. И нафига здесь передавать целевую функцию извне параметром? Уж если она известна уровнем выше, то доступ к данным и вызов функции можно разделить. Но и в таком чудном варианте можно обойтись двумя языковыми конструкциями:
1. Подпрограммой и её вызовом. В c++ функцией и её вызовом.
2. Процедурным типом, или его аналогом. В c++ указателем на функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
typedef int (*tf)(int x, int y);
struct A
{
 int x;
 int y;
};
int m(A a, tf f)
{
 return f(a.x, a.y);
}
int d(int x, int y)
{
 return x*y;
}
int main()
{
 A a;
 std::cin>>a.x;
 std::cin>>a.y;
 std::cout<< m(a, d)<<std::endl;
 return 0;
}
. Всё. При чём здесь какие то загадочные монады?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
10.08.2015, 08:33  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Не можешь?
Не хочу.

Цитата Сообщение от taras atavin Посмотреть сообщение
Значит они и тебе то не нужны.
Согласен. Мне они не нужны.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.08.2015, 08:35
Цитата Сообщение от castaway Посмотреть сообщение
Не хочу.
Я тоже не хочу. Ну так я и не пытаюсь агитировать за них.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
10.08.2015, 08:37  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Ну так я и не пытаюсь агитировать за них.
А я по-твоему пытаюсь агитировать?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.08.2015, 08:38
Значит показалось.
0
 Аватар для cybercitizen
204 / 26 / 5
Регистрация: 22.05.2015
Сообщений: 357
17.08.2015, 00:37
Цитата Сообщение от taras atavin Посмотреть сообщение
При чём здесь какие то загадочные монады?
Здесь конечно ни при чем, так же как и всё что ты написал.
0
Модератор
 Аватар для Curry
5168 / 3530 / 536
Регистрация: 01.06.2013
Сообщений: 7,683
Записей в блоге: 9
17.08.2015, 23:48
Попробую объяснить, зачем нужны монады в Haskell без примеров кода.
В ФП часто используются цепочки из функций – результат одной функции подставляется как аргумент другой. Синтаксис позволяет записывать такие цепочки компактно, без обилия скобок.
Но, часто, просто передавать один аргумент по цепочке недостаточно. Простейший пример – передавать два значения. Можно ручками – разворачивать то, что возвратила функция и передавать в два аргумента. Но, сразу потеряется компактность. Монада State позволяет передавать ещё один аргумент «незаметно», и, таким образом, решать эту проблемку. В общем случае, монады предоставляют возможность устроить цепочку функций с «наворотами» - ведение лога, операции ввода-вывода, чтение конфигурации, парсинг выражений … много чего. Монады могут быть вложены друг в друга образуя монадный стек. Сами монады не встроены в Haskell, но компилятор предоставляет для них сахар. С сахарком можно записывать код, похожий на императивный, хотя, на самом деле, он разворачивается всё в ту же цепочку функций.
castaway привёл пример библиотеки реализации монад на плюсах. Я её, честно говоря, не смотрел пока. Исходя из вышесказанного, в императивном языке, монады, как минимум, не так важны.
0
 Аватар для Crast
72 / 72 / 5
Регистрация: 10.02.2013
Сообщений: 434
23.08.2015, 18:13
Я видел этот паттерн. Его облюбовал один из создателей boost::spirit (Hartmut Kaiser). Его асинхронная библиотека(hpx) работает подобным образом.
Суть его не в том, что это монада, а в том, что это позволяет писать быстрый читаемый асинхронный код.

Добавлено через 23 секунды
"Избавиться от спагетти-кода" - один из их лозунгов))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.08.2015, 19:33
Цитата Сообщение от Crast Посмотреть сообщение
boost::spirit
Цитата Сообщение от Crast Посмотреть сообщение
быстрый читаемый асинхронный код.
слово "читаемый" - явное преувеличение.
даже для тех, кто очень плотно имел дело с спиритом.
0
 Аватар для Crast
72 / 72 / 5
Регистрация: 10.02.2013
Сообщений: 434
29.08.2015, 14:17
hoggy, говори честно - какие наркотики употребляешь. Может у тебя еще есть шанс на спасение. То код с исключениями не сопровождаем, то годные DSL нужно обязательно выкинуть на помойку. Тогда уж лучше совсем забыть о крестах, и взять сишку.

Вот как предлагается писать асинхронный код
C++
1
2
3
4
5
6
7
8
transaction (
      connect  | on_connect ->
      handshake | on_handshake ->
      authenticate | on_authenticate ->
      write_data | on_write_data ->
      read_confirmation | on_confirmation,
      cancel_operation //on error
);
Каждая функция будет соответствующим объектом (или абстрактной фабрикой), принимающим и возвращающим определенный пакет данных. После завершения операции вызывается then с последующей функцией.

spirit же очень читаемый. Нужно только уметь правильно ориентироваться в ошибках.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.08.2015, 14:40
Цитата Сообщение от Crast Посмотреть сообщение
говори честно - какие наркотики употребляешь. Может у тебя еще есть шанс на спасение. То код с исключениями не сопровождаем, то годные DSL нужно обязательно выкинуть на помойку.
учитывая, что вы преписываете мне то,
чего я никогда не утверждал,
этот вопрос вы можете задать самому себе.
0
 Аватар для Crast
72 / 72 / 5
Регистрация: 10.02.2013
Сообщений: 434
29.08.2015, 15:01
hoggy, видишь у тебя уже склероз от зависимости.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.08.2015, 15:04
Цитата Сообщение от Crast Посмотреть сообщение
видишь у тебя уже склероз от зависимости.
не пишите мне больше ничего.
0
Evg
29.08.2015, 15:49

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
не пишите мне больше ничего
На форуме имеется замечательная возможность отправлять людей в игнор

0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
05.09.2015, 20:33
Монады в c++ не нужны. C++ тоже не нужен.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.09.2015, 20:51  [ТС]
Цитата Сообщение от alkagolik Посмотреть сообщение
C++ тоже не нужен.
Не нужен для чего?
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
05.09.2015, 21:11
Цитата Сообщение от castaway Посмотреть сообщение
Не нужен для чего?
Ни для чего не нужен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.09.2015, 21:11

Монады, чистые/грязные функции
я только начал разбираться в этих вещах и не совсем понимаю как мне реализовать те функции которые так легко реализуются в императивных...

Как реализованы операции монады над списками?
Как возник вопрос. У меня часто стали появляться вот такие конструкции. l = Хотелось бы писать например как то так. l = list $...

Какие значения нужны нужны циклу while?
#include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main(void) { int A={1,2,3,4,49,100,49};...

нужны отзывы
Здравствуйте, хотелось бы узнать мнение об этом ноутбуке http://www.eldorado.ru/cat/detail/71073753/ или что то подобное Добавлено...

Нужны советы
1.Что такое свойство? 2. Что представляет собой делегат? 3. Почему делегат называют функциональным типом? 4. Перечислите базовые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru