Re[21]: Об монады.
От: samius Россия http://sams-tricks.blogspot.com
Дата: 03.09.19 13:47
Оценка: 7 (2)
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>И все-таки Task<T> не был интегрирован в Linq и без await использовать его в коде было тяжело.


S>А в чем проблема вызвать Task.Wait() или Task.ContinueWhen()?

Вызвать эти методы не проблема. Проблема скомбинировать результаты выполнения нескольких тасков в одном выражении, как это делается в монадном сахаре.

S>>return зашит в самом SelectMany, кроме этого у него два аргумента-функции.


S>А почему именно две ф-ия аргумента важны? Почему просто Select не подходит. Я реально в этом(монадах) не понимаю ничего, вот и спрашиваю. Тут, вероятно, надо понять как bind работает...

две функции важны в том плане, что стандартный bind принимает лишь одну. Одно значение и одну функцию.
Select вообще не про это, он от функтора
Согласен, вероятно, надо понять bind.

S>>>>Так и не знаю причины, почему это реализовано именно так.


S>>Я же написал выше. Связывание вычислений по нескольким контейнерам в Haskell, F#, Scala — вложенное. Есть внешний bind, в который передается функция, использующая следующий bind:

S>>
S>>bind(...,x => bind(...))
S>>

S>>Но в C# мы имеем:
S>>
S>>a.SelectMany(...).SelectMany(...)
S>>


S>Не очень помогло, ибо по-прежнему не пониаю сути bind...

Как Select/map в функторе проецирует контейнер с помощью указанного преобразования для значений в контейнере, так bind показывает как связывать вычисление из двух контейнеров одного монадного типа в третий. Именно он определяет что результат связывания вычислений по двум спискам основан на декартовом произведении, что для MayBe<T> нужно проверить наличие обоих значений, для двух тасков — создать таск, который скомбинирует результаты двух данных по мере получения результатов.
Именно этого и не хватало в C# для комбинирования двух тасков.
Re[22]: Об монады.
От: Sharov Россия  
Дата: 03.09.19 14:41
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, Sharov, Вы писали:


S>>Здравствуйте, samius, Вы писали:


S>>>И все-таки Task<T> не был интегрирован в Linq и без await использовать его в коде было тяжело.


S>>А в чем проблема вызвать Task.Wait() или Task.ContinueWhen()?

S>Вызвать эти методы не проблема. Проблема скомбинировать результаты выполнения нескольких тасков в одном выражении, как это делается в монадном сахаре.


S>Как Select/map в функторе проецирует контейнер с помощью указанного преобразования для значений в контейнере, так bind показывает как связывать вычисление из двух контейнеров одного монадного типа в третий. Именно он определяет что результат связывания вычислений по двум спискам основан на декартовом произведении, что для MayBe<T> нужно проверить наличие обоих значений, для двух тасков — создать таск, который скомбинирует результаты двух данных по мере получения результатов.

S>Именно этого и не хватало в C# для комбинирования двух тасков.

TaskFactory.ContinueWhenAll
Кодом людям нужно помогать!
Re[23]: Об монады.
От: samius Россия http://sams-tricks.blogspot.com
Дата: 03.09.19 15:39
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>Именно этого и не хватало в C# для комбинирования двух тасков.


S>TaskFactory.ContinueWhenAll


Хотелось бы увидеть пример применения ContinueWhenAll, не сильно далекий от следующего:

var task3 = from string a in task1
            from int b in task2
            select $"{a}:{b}";
Re[5]: Реальные проекты на экзотике (Haskell и пр.) - как?
От: jamesq  
Дата: 03.09.19 15:46
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, уважаемый alzt, Вы писали:


A>>Не знаю ни одного человека, кто бы "выучил язык за деньги". Большинство учило, т.к. им было интересно программировать.

AG>+100500
AG>Да, именно потому, что интересно!
AG>А если интересно, то будт тебе работа в радость!
AG>Тогда-то и за оплатой твоего труда — дело не станет!

<offtopic>
К сожалению, такие заявления разбиваются о прозу реальности.
Некоторые считают, что коли сотруднику интересно, можно особо ему не платить. Он на голом интересе работать будет.
</offtopic>
Re[24]: Об монады.
От: Sharov Россия  
Дата: 03.09.19 17:54
Оценка:
S>>TaskFactory.ContinueWhenAll
S>Хотелось бы увидеть пример применения ContinueWhenAll, не сильно далекий от следующего:

S>
S>var task3 = from string a in task1
S>            from int b in task2
S>            select $"{a}:{b}";
S>


var rand = new Random();
            Task<int> task1 = Task<int>.Factory.StartNew((() =>
            {
                Thread.Sleep(rand.Next(2000));
                return 9;
            }));

            var task2 = Task<string>.Factory.StartNew((() =>
            {
                Thread.Sleep(rand.Next(2000));
                return "asdsa";
            }));

           var cont = Task.Factory.ContinueWhenAll(new Task[]{task1, task2}, (tasks) =>
           {
               int i = tasks.OfType<Task<int>>().First().Result;
               string str = tasks.OfType<Task<string>>().First().Result;
               var temp = $"{i}:{str}";
               return temp;
            });


Я понимаю, что енто мягко говоря не айс. Еще можно использовать сами таски task1 и task2 в самом continuationэ'е и взять результат без приседаний. Либо чуть более изящный варинат,
но не эффективный -- всюду использовать Task<object>. Но теряем в типизации и boxing.
Кодом людям нужно помогать!
Re[25]: Об монады.
От: samius Россия http://sams-tricks.blogspot.com
Дата: 03.09.19 19:52
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>Хотелось бы увидеть пример применения ContinueWhenAll, не сильно далекий от следующего:


S>>
S>           var cont = Task.Factory.ContinueWhenAll(new Task[]{task1, task2}, (tasks) =>
S>           {
S>               int i = tasks.OfType<Task<int>>().First().Result;
S>               string str = tasks.OfType<Task<string>>().First().Result;
S>               var temp = $"{i}:{str}";
S>               return temp;
S>            });
S>

На выражение не похоже, но можно без особого труда заинлайнить все переменные... В ущерб читаемости кода.
Кстати, можно сделать
int i = task1.Result;


S>Я понимаю, что енто мягко говоря не айс. Еще можно использовать сами таски task1 и task2 в самом continuationэ'е и взять результат без приседаний. Либо чуть более изящный варинат,

S>но не эффективный -- всюду использовать Task<object>. Но теряем в типизации и boxing.

А теперь представим, что некоторую задачу task3 нужно запустить только в случае если сошлись звезды (выполнились условия над результатами первых двух задач), и в свою очередь к его Continuation передать результат вычисления первого ContinueWhenAll...
При этом, если части задач указать, что они должны быть выполнены синхронно (не требуют ожидания, т.к. входящие таски выполнены), прописать, что нужно делать при каких исключениях, станет понятно что простая идея кода будет превращена в лапшу. Здесь await-ы (не являясь, фактически, монадами) подходят лучшим образом.
Re[13]: Реальные проекты на экзотике (Hascell и пр.) - как?
От: dsorokin Россия  
Дата: 04.09.19 04:59
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Poopy Joe, Вы писали:


PJ>>Я могу предложить следующий критерий, без претензий на его полноту или формальную корректность: если монады кажутся помехой, костылем к языку, чтобы "решать проблемы которых нет в функциональных языках (с)" или "способ писать императивно на хаскеле" то ты точно не понимаешь базовых принципов.


S>Если хочешь понять что такое монады — читай пост IT http://rsdn.org/forum/flame.comp/7530546.1
Автор: IT
Дата: 30.08.19


S>Это всего лишь способ избавиться от "служебного кода".


Поддерживаю здесь коллегу Poopy Joe. Правильно написал. Может быть, только должно быть: "решать проблемы которых нет в функциональныхимперативных языках (с)"

И тут как с обычной математикой. Есть такой парадокс. Чем вещь проще и абстрактнее, тем ее обычно сложнее понять и оценить. Хаскель в своей основе довольно прост, лаконичен и изящен как сама математика.

Здесь надо просто читать книги по хаскелю, писать на нем код. На тех же Java, C#, C++ нужно делать ровно то же самое. Просто последние языки похожи во многом друг на друга (без учета GC). Поэтому опыт в одном из них идет в копилку знаний для другого. Так и накапливается совокупный опыт со школьных ученических лет. Поэтому студенты уже могут писать вполне неплохой код на последних языках.

Хаскель же другой, но в принципе позволяет решать те же проблемы, кроме системных задач, для которых годятся лишь немногие: C++ там, С, Ada, Rust, Forth, асемблер, но их в наше время осталось совсем немного таких.

Может быть, только хаскель лучше подходит тем, у кого есть способности к математике, но таких программистов довольно много, и даже среди не-программистов. Диплом вуза это не репрезентативный критерий.
Отредактировано 04.09.2019 5:03 dsorokin . Предыдущая версия .
Re[14]: Реальные проекты на экзотике (Hascell и пр.) - как?
От: Poopy Joe Бельгия  
Дата: 04.09.19 06:50
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Поддерживаю здесь коллегу Poopy Joe. Правильно написал. Может быть, только должно быть: "решать проблемы которых нет в функциональныхимперативных языках (с)"

О, конечно императивных, спасибо за исправление.

D>И тут как с обычной математикой. Есть такой парадокс. Чем вещь проще и абстрактнее, тем ее обычно сложнее понять и оценить. Хаскель в своей основе довольно прост, лаконичен и изящен как сама математика.

Странные доводы критиков ФЯ, хаскель тут лишь один из множества, в том, что все эти абстракции нужны редко. Но тут перепутаны причина и следствие. Это не абстракции нужны редко, это их наличие позволяет их использовать в своих решениях. Тут подойдет сравнение не только с математикой, но и с обычным языком. Можно разговаривать исключительно матом, вставляя "абстракции" только в крайнем случае. Многословно да, не особенно внятно и нет гарантии, что поймут верно. Но ведь поймут, при должном старании. А можно выучить язык и использовать всю его мощь, для краткого и точного выражения мыслей. И для этого не надо быть математиком или филологом.
Re[26]: Об монады.
От: Sharov Россия  
Дата: 04.09.19 09:26
Оценка:
Здравствуйте, samius, Вы писали:


S>Кстати, можно сделать

S>
S>int i = task1.Result;
S>


Я ровно ентот способ и описал:

Еще можно использовать сами таски task1 и task2 в самом continuationэ'е и взять результат без приседаний.


S>А теперь представим, что некоторую задачу task3 нужно запустить только в случае если сошлись звезды (выполнились условия над результатами первых двух задач), и в свою очередь к его Continuation передать результат вычисления первого ContinueWhenAll...

S>При этом, если части задач указать, что они должны быть выполнены синхронно (не требуют ожидания, т.к. входящие таски выполнены), прописать, что нужно делать при каких исключениях, станет понятно что простая идея кода будет превращена в лапшу. Здесь await-ы (не являясь, фактически, монадами) подходят лучшим образом.

Не очень понял постановку задачи, но не суть. А вот чем await лучше ContinueWith, учитывая что первое есть синтаксический сахар для второго?
Я не вижу, что можно сделать с помощью await чего нельзя с помощь ContinueWith.
Кодом людям нужно помогать!
Re[6]: Реальные проекты на экзотике (Haskell и пр.) - как?
От: AlexGin Беларусь  
Дата: 04.09.19 14:22
Оценка:
Здравствуйте, уважаемый jamesq, Вы писали:

AG>>Да, именно потому, что интересно!

AG>>А если интересно, то будт тебе работа в радость!
AG>>Тогда-то и за оплатой твоего труда — дело не станет!

J><offtopic>

J>К сожалению, такие заявления разбиваются о прозу реальности.
J>Некоторые считают, что коли сотруднику интересно, можно особо ему не платить. Он на голом интересе работать будет.
J></offtopic>

Ну если же за оплатой твоего труда всё-таки дело станет, то человеку увлеченному и знающему — легко сменить работодателя.
Тем более, что увлечённость и интерес — предполагает постоянный и непрерывный професиональный рост.
В этом случае, поиск новой работы и прохождение собеседований — рассматривается профессионалом как ещё один (очередной) вариант повышения квалификации.
Отредактировано 04.09.2019 14:26 AlexGin . Предыдущая версия .
Re: Реальные проекты на экзотике (Haskell и пр.) - как?
От: _AND Российская Империя Мы русскiе — съ нами Богъ!
Дата: 04.09.19 17:01
Оценка:
S>Вот, некоторые люди на работе пишут на Haskell. Как они до этого доходят?

Я вот писал на с++. Пришёл в контору, которой нужен был программист на экзотическом языке, но где понимали что его не найти и искали сишников что-бы потом переучить. Пару месяцев почитал книжки, поразбирался с проектом и вперёд. Так и дошёл.
Re[27]: Об монады.
От: samius Россия http://sams-tricks.blogspot.com
Дата: 04.09.19 21:44
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>При этом, если части задач указать, что они должны быть выполнены синхронно (не требуют ожидания, т.к. входящие таски выполнены), прописать, что нужно делать при каких исключениях, станет понятно что простая идея кода будет превращена в лапшу. Здесь await-ы (не являясь, фактически, монадами) подходят лучшим образом.


S>Не очень понял постановку задачи, но не суть. А вот чем await лучше ContinueWith, учитывая что первое есть синтаксический сахар для второго?

Код более читаемый, значит, в него легче въехать и изменить либо исправить.

S>Я не вижу, что можно сделать с помощью await чего нельзя с помощь ContinueWith.

Точно так же ничего такого нельзя сделать на C#/C++/Haskell, чего нельзя на ассемблере. Вопрос удобства, скорости разработки, стоимости, легкости поиска замены специалистов. Ответ на вопрос "чем лучше" лежит в плоскости нефункциональных требований.
Re[28]: Об монады.
От: Sharov Россия  
Дата: 06.09.19 13:00
Оценка:
Здравствуйте, samius, Вы писали:

S>>Не очень понял постановку задачи, но не суть. А вот чем await лучше ContinueWith, учитывая что первое есть синтаксический сахар для второго?

S>Код более читаемый, значит, в него легче въехать и изменить либо исправить.

Воможно. У меня в коде полно коснтрукций типа

     var task1 = TaskFactory.StartNew(() =>
                    {
               //do smth
                    }, TaskCreationOptions.LongRunning|TaskCreationOptions.PreferFairness);



            var reserveTask = task1 (
                    t => { //do smth},
                    TaskContinuationOptions.NotOnRanToCompletion|TaskContinuationOptions.PreferFairness);



Я четко контролирую параметры continuation'а. С awiat'ом как это можно получить? А так на все случаи жизни я прописыаю соотв continuation с соотв параметрами.
Кодом людям нужно помогать!
Re[29]: Об монады.
От: samius Россия http://sams-tricks.blogspot.com
Дата: 07.09.19 03:05
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>>Не очень понял постановку задачи, но не суть. А вот чем await лучше ContinueWith, учитывая что первое есть синтаксический сахар для второго?

S>>Код более читаемый, значит, в него легче въехать и изменить либо исправить.

S>Воможно. У меня в коде полно коснтрукций типа


S>
S>     var task1 = TaskFactory.StartNew(() =>
S>                    {
S>               //do smth
S>                    }, TaskCreationOptions.LongRunning|TaskCreationOptions.PreferFairness);



S>            var reserveTask = task1 (
S>                    t => { //do smth},
S>                    TaskContinuationOptions.NotOnRanToCompletion|TaskContinuationOptions.PreferFairness);
S>



S>Я четко контролирую параметры continuation'а. С awiat'ом как это можно получить? А так на все случаи жизни я прописыаю соотв continuation с соотв параметрами.


await-ы не отменяют параметры тасков, continuation-ов. Они меняют форму получения и обработки значений. Склеивают воедино те места кода (примера) где написано

//do smth
//do smth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.