Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Монады / 25 сообщений из 136, страница 1 из 6
06.08.2014, 01:52
    #38713565
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монады
Кто-нибудь всерьёз использует свои велосипедные монады в C#?
...
Рейтинг: 0 / 0
06.08.2014, 06:30
    #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
06.08.2014, 06:58
    #38713598
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монады
Сон Веры Павловны,

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

Ещё меня интересует Maybe/Nullable вместо утомительного написания контрактов и проверок для null checking. Вот бы ещё ввели оператор, типа SomeMethod(SomeType !argument), эх...
...
Рейтинг: 0 / 0
06.08.2014, 07:38
    #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
06.08.2014, 07:51
    #38713608
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монады
Алексей КНе проще нормально отформатировать?

фу-фу-фу. монады гораздо читабельней и безопасней. очень часто приходится работать с графом объектов, и эти проверки не доставляют ни на этапе разработки, ни на этапе сопровождения.
...
Рейтинг: 0 / 0
06.08.2014, 08:12
    #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
06.08.2014, 08:15
    #38713613
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монады
hVosttКто-нибудь всерьёз использует свои велосипедные монады в C#?Использую, работают.
...
Рейтинг: 0 / 0
06.08.2014, 08:33
    #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
06.08.2014, 08:41
    #38713629
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Монады
Алексей ККаждый сложный пример всегда можно разбить на множество простых.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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