powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Монады
25 сообщений из 136, страница 1 из 6
Монады
    #38713565
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь всерьёз использует свои велосипедные монады в C#?
...
Рейтинг: 0 / 0
Монады
    #38713592
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется. Пока еще для Roslyn допилят свой null propagating , и когда еще это доберется до наших реалий. Для меня лично предпочтительнее написать:
Код: c#
1.
2.
3.
4.
var len = GetCustomer()
  .With(c => c.ExtraRef)
  .With(e => e.Name)
  .With(s => new int?(s.Length));


чем писать лесенку вида
Код: c#
1.
2.
3.
int? len;
if (customer != null && customer.ExtraRef != null && customer.ExtraRef.Name != null)
  len = customer.ExtraRef.Name.Length;


учитывая, что в реальности эти лесенки бывают намного длинее и нетривиальнее.
Хотя, конечно, обещаемое в Roslyn смотрится изящнее:
Код: c#
1.
int? len = GetCustomer()?.extraRef?.name?.Length;
...
Рейтинг: 0 / 0
Монады
    #38713598
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Не думаю, что null propagating полностью отменит необходимости своих костылей, так как в With можно задать любое выражение, а n/p работает только со свойствами.

Ещё меня интересует Maybe/Nullable вместо утомительного написания контрактов и проверок для null checking. Вот бы ещё ввели оператор, типа SomeMethod(SomeType !argument), эх...
...
Рейтинг: 0 / 0
Монады
    #38713603
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныРазумеется. Пока еще для Roslyn допилят свой null propagating , и когда еще это доберется до наших реалий. Для меня лично предпочтительнее написать:
Код: c#
1.
2.
3.
4.
var len = GetCustomer()
  .With(c => c.ExtraRef)
  .With(e => e.Name)
  .With(s => new int?(s.Length));


чем писать лесенку вида
Код: c#
1.
2.
3.
int? len;
if (customer != null && customer.ExtraRef != null && customer.ExtraRef.Name != null)
  len = customer.ExtraRef.Name.Length;

Не проще нормально отформатировать?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
int? len;
if 
(
    customer != null && 
    customer.ExtraRef != null && 
    customer.ExtraRef.Name != null
)
  len = customer.ExtraRef.Name.Length;


Сон Веры Павловныучитывая, что в реальности эти лесенки бывают намного длинее и нетривиальнее.Пофиг. Решается форматированием.
Сон Веры ПавловныХотя, конечно, обещаемое в Roslyn смотрится изящнее:
Код: c#
1.
int? len = GetCustomer()?.extraRef?.name?.Length;

Нах не нужно...

зы: Извращенцы...
...
Рейтинг: 0 / 0
Монады
    #38713608
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе проще нормально отформатировать?

фу-фу-фу. монады гораздо читабельней и безопасней. очень часто приходится работать с графом объектов, и эти проверки не доставляют ни на этапе разработки, ни на этапе сопровождения.
...
Рейтинг: 0 / 0
Монады
    #38713612
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПофиг. Решается форматированием.
Нет, не пофиг. Выше приведен был самый простейший случай, и только одна монада - в реальности их может быть намного больше. Некогда на GotDotNet в блогах была статья про монадический синтатксис. сейчас из-за реорганизации это всё дело куда-то подевалось - там рассматривался такой пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
string postCode;
if (person != null)
{
  if (HasMedicalRecord(person) && person.Address != null)
  {
    CheckAddress(person.Address);
    if (person.Address.PostCode != null)
      postCode = person.Address.PostCode.ToString();
    else
      postCode = "UNKNOWN";
  }
}


и вариант решения с монадами:
Код: c#
1.
2.
3.
4.
5.
6.
string postCode = this.With(x => person)
    .If(x => HasMedicalRecord(x))]
    .With(x => x.Address)
    .Do(x => CheckAddress(x))
    .With(x => x.PostCode)
    .Return(x => x.ToString(), "UNKNOWN");


- и это опять же достаточно искусственный пример, в реальности бывает всё намного хуже. Я считаю, что это прекрасная замена бесконечным стопками if'ов (тот самый вышеупомянутый граф объектов), от которых начинает в глязах рябить.
...
Рейтинг: 0 / 0
Монады
    #38713613
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКто-нибудь всерьёз использует свои велосипедные монады в C#?Использую, работают.
...
Рейтинг: 0 / 0
Монады
    #38713625
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныАлексей КПофиг. Решается форматированием.
Нет, не пофиг. Выше приведен был самый простейший случай, и только одна монада - в реальности их может быть намного больше. Некогда на GotDotNet в блогах была статья про монадический синтатксис. сейчас из-за реорганизации это всё дело куда-то подевалось - там рассматривался такой пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
string postCode;
if (person != null)
{
  if (HasMedicalRecord(person) && person.Address != null)
  {
    CheckAddress(person.Address);
    if (person.Address.PostCode != null)
      postCode = person.Address.PostCode.ToString();
    else
      postCode = "UNKNOWN";
  }
}


и вариант решения с монадами:
Код: c#
1.
2.
3.
4.
5.
6.
string postCode = this.With(x => person)
    .If(x => HasMedicalRecord(x))]
    .With(x => x.Address)
    .Do(x => CheckAddress(x))
    .With(x => x.PostCode)
    .Return(x => x.ToString(), "UNKNOWN");

Выделение метода?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string GetPostCode(Person person)
{
    if 
    (
        person != null && 
        HasMedicalRecord(person) && 
        person.Address != null
    )
    {
       CheckAddress(person.Address);
       return person.Address.PostCode != null ? person.Address.PostCode.ToString() : "UNKNOWN";
    }
    return null;
}


Сон Веры Павловныи это опять же достаточно искусственный пример, в реальности бывает всё намного хуже. Я считаю, что это прекрасная замена бесконечным стопками if'ов (тот самый вышеупомянутый граф объектов), от которых начинает в глязах рябитьКаждый сложный пример всегда можно разбить на множество простых.
...
Рейтинг: 0 / 0
Монады
    #38713629
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККаждый сложный пример всегда можно разбить на множество простых.

Монады это как раз и делают, только универсально. Задача обхода графов объектов вполне типичная, и повторяется множество раз. Вполне логично запилить универсальное решение по принципу less is more . Тоже самое можно сказать и об LINQ и лямбдах -- зачем они нужны, если есть циклы и всегда можно разбить метод на кучку мелких методов.
...
Рейтинг: 0 / 0
Монады
    #38713630
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИспользую, работают.

Maybe тоже используешь?
...
Рейтинг: 0 / 0
Монады
    #38713633
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей ККаждый сложный пример всегда можно разбить на множество простых.

Монады это как раз и делают, только универсально. Задача обхода графов объектов вполне типичная, и повторяется множество раз.Эта задача успешно решается родными средствами языка.
hVosttВполне логично запилить универсальное решение по принципу less is more .На любителя.
hVosttТоже самое можно сказать и об LINQ и лямбдах -- зачем они нужны, если есть циклы и всегда можно разбить метод на кучку мелких методов.Там экономится много строк кода. Тут экономии не вижу.
...
Рейтинг: 0 / 0
Монады
    #38713636
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭта задача успешно решается родными средствами языка.

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

Монадический синтаксис более выразителен и лаконичен вместо лесенки условий или выделения методов. У разбиения метода на более мелкие методы тоже есть придел, и когда-то может встать поперёк горла одни и те же действия, без которых можно вполне обойтись.

Алексей КТам экономится много строк кода. Тут экономии не вижу.

Экономия и выразительность намерений (что даже гораздо важнее) более чем очевидны.
...
Рейтинг: 0 / 0
Монады
    #38713640
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос всплыл после прочтения статьи Контракты vs. Монады? , и мне стало интересно, кто-нибудь пробовал внедрить монады для борьбы с нулевыми ссылками, или обходимся контрактами и чеками в каждом методе?
...
Рейтинг: 0 / 0
Монады
    #38713648
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КЭта задача успешно решается родными средствами языка.

Ну так кастомная реализация монад -- это и есть решение родными средствами языка. Используются методы расширения, функторы и деревья выражений .System.LINQ.Expression? И компилируются поди налету? Видимо, торопиться некуда.
hVosttМонадический синтаксис более выразителен и лаконичен вместо лесенки условий или выделения методов.В данном случае - нет.
hVosttУ разбиения метода на более мелкие методы тоже есть приделМожно обойтись и без выделения метода. Никто не заставляет.
hVostt, и когда-то может встать поперёк горла одни и те же действия, без которых можно вполне обойтись.Описывать на каждый чих лямбду удовольствие тоже не из приятных.
hVosttАлексей КТам экономится много строк кода. Тут экономии не вижу.

Экономия и выразительность намерений (что даже гораздо важнее) более чем очевидны.Субъективно.
...
Рейтинг: 0 / 0
Монады
    #38713658
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVosttМонадический синтаксис более выразителен и лаконичен вместо лесенки условий или выделения методов.В данном случае - нет.

Трудно спорить с учётом того, что никакого конкретного (данного) случая не обсуждается.
...
Рейтинг: 0 / 0
Монады
    #38713660
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кпропущено...
В данном случае - нет.

Трудно спорить ...Я не спорю, я делюсь впечатлениями. :-)
hVostt... с учётом того, что никакого конкретного (данного) случая не обсуждается.Выше был приведён неубедительный для меня пример. Предложите другой.

зы:
Код: c#
1.
int? len = GetCustomer()?.extraRef?.name?.Length;

На счёт этого я погорячился. Поддержка этого на уровне языка будет полезна.
...
Рейтинг: 0 / 0
Монады
    #38713674
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAИспользую, работают.

Maybe тоже используешь?Конечно.
...
Рейтинг: 0 / 0
Монады
    #38713676
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВыше был приведён неубедительный для меня пример. Предложите другой.

Ну так экстраполируйте :) Представьте граф из 10 вложенных объектов. В чём великий смысл описывать одно и тоже два раза? Это же типичная задача. Сначала проверять, затем извлекать.
...
Рейтинг: 0 / 0
Монады
    #38713678
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttпропущено...
Maybe тоже используешь?Конечно.

О, круто!
...
Рейтинг: 0 / 0
Монады
    #38713684
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, если разрешить в команде более чем из 3-х человек каждому форматировать код так, как он считает "нормально", то через полгода осознание того, что лучше бы использовали монады, само придёт
...
Рейтинг: 0 / 0
Монады
    #38713688
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КВыше был приведён неубедительный для меня пример. Предложите другой.

Ну так экстраполируйте :)Экстраполировал, ужаснулся. :-)
hVosttПредставьте граф из 10 вложенных объектов. В чём великий смысл описывать одно и тоже два раза? Это же типичная задача. Сначала проверять, затем извлекать.Повторюсь. Не вижу смысла использовать лямбды там, где без них можно обойтись.
...
Рейтинг: 0 / 0
Монады
    #38713702
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДумаю, если разрешить в команде более чем из 3-х человек каждому форматировать код так, как он считает "нормально", то через полгода осознание того, что лучше бы использовали монады, само придёт Административные способы воздействия более эффективны.
...
Рейтинг: 0 / 0
Монады
    #38713723
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе вижу смысла использовать лямбды там, где без них можно обойтись.

так везде можно....
...
Рейтинг: 0 / 0
Монады
    #38713728
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КНе вижу смысла использовать лямбды там, где без них можно обойтись.

так везде можно....Но не везде нужно.
...
Рейтинг: 0 / 0
Монады
    #38713864
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAДумаю, если разрешить в команде более чем из 3-х человек каждому форматировать код так, как он считает "нормально", то через полгода осознание того, что лучше бы использовали монады, само придёт Административные способы воздействия более эффективны.Зачем было предлагать то, что уже запрещено административными способами?
...
Рейтинг: 0 / 0
25 сообщений из 136, страница 1 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Монады
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]