Re[3]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 29.08.19 21:19
Оценка: +1
Здравствуйте, takTak, Вы писали:

J>>Бывает, но в haskel'е. Для того, чтоб монады были полезны на практике нужен high kinded polimorphism, которого в жаба-шарпах нету


T>а можно как-то поподробнее и "на пальцах"?


На практике это утверждение выше неверно. В шарпе есть линк, который монада и который вполне себе полезен. high kinded polimorphism позволяет определенные вещи (трансформеры например), недоступные в других языках, но совершенно не является чем-то критическим.

T>допустим, в яве -шарпах, мне не нравится такой код

Такой код к монадам отношение имеет довольно слабое. Ключевой оператор у монады это bind.


T>
T>if (a != null)
T>            {
T>                if (a.Prop1 != null)
T>                {
                    
T>                }
T>            }
T>

T>с помощью Maybe / Option / Either- монад его можно переписать во что-то более удобочитаемое,
Тут даже вопрос не только в читаемости, которой в примере спагетти-кода нет вообще. Проблема в том, null не имеет типа. У maybe и either он есть.
Отредактировано 29.08.2019 22:25 Poopy Joe . Предыдущая версия .
Re[4]: Монады - пример где бы были полезны...
От: Shmj Ниоткуда  
Дата: 29.08.19 21:33
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Получилось весело:

J>
J>var _1 = 
J>    from _2 in DoBlaBlaAsync()
J>    from _3 in DoOtherBlaBlaAsync()
J>    from x in GetBlaBlaAsync()
J>    from _4 in DoWorkAsync(x)
J>    select 1;
J>


Вот чел. сделал на C# монаду IO тем же макаром: https://habr.com/ru/post/282940/

class Program {
    static void Main(string[] args) {
        AppInstance.Get().DoMain(IOMain);
    }
    static IO<None> IOMain() {
        return
            from _ in IO.Do(() => Console.WriteLine("What is your name?"))
            from name in IO.Do(() => Console.ReadLine())
            let message = "Hi, " + name + "!"
            from r in IO.Do(() => Console.WriteLine(message))
            select r;
    }
}


В этом примере смысл ускользает...

Больше похоже что монады — позволяют писать в императивном стиле в языках функциональных. Т.е. для императивных это получается масло масляное — сначала вводите в императивный язык элементы функционального, затем на этих функциональных недо-элементах строите то, что встроено в язык изначально.

Не знаю, может я еще не достиг понимания ДАО, конечно. Может когда установлю Хаскеля и поковыряю. Но стоит ли тратить время?
Re[4]: Монады - пример где бы были полезны...
От: Shmj Ниоткуда  
Дата: 29.08.19 21:46
Оценка:
Здравствуйте, Poopy Joe, Вы писали:

PJ>В шарпе есть линк, который монада и который вполне себе полезен.


Т.е. Linq можно назвать монадой и никто не будет возражать? И если я умею его исопользовать и примерно знаю как устроен — то можно сказать что я познал "Великое Дао Монад" ?

Или же сразу скажут что эта Монада не есть истинная Монада?
Re[5]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 29.08.19 22:24
Оценка:
Здравствуйте, Shmj, Вы писали:


S>
S>class Program {
S>    static void Main(string[] args) {
S>        AppInstance.Get().DoMain(IOMain);
S>    }
S>    static IO<None> IOMain() {
S>        return
S>            from _ in IO.Do(() => Console.WriteLine("What is your name?"))
S>            from name in IO.Do(() => Console.ReadLine())
S>            let message = "Hi, " + name + "!"
S>            from r in IO.Do(() => Console.WriteLine(message))
S>            select r;
S>    }
S>}
S>


S>В этом примере смысл ускользает...

Смысл тут может быть вполне в том, чтобы изолировать сайд-эффекты. То, что хаскель это обязывает делать, не означает, что в других языках это нельзя выразить. Помощи от компилятора просто не будет.

S>Больше похоже что монады — позволяют писать в императивном стиле в языках функциональных.

Именно что "похоже"

S>Не знаю, может я еще не достиг понимания ДАО, конечно. Может когда установлю Хаскеля и поковыряю. Но стоит ли тратить время?

Однозначно. Но есть одна опасность — еще не знаю ни одного человека, который был "познав ДАО" смог писать, без отвращение, на императивных языках.
Re[4]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 29.08.19 22:28
Оценка:
Здравствуйте, Jack128, Вы писали:

IT>>Кое-что есть в достаточной степени, чтобы кое-как кривенько поддерживать монады.

J>Ну до появления async/await я написал экстеншн методы для Task, чтоб эти таски можно было в query syntax использовать

J>Получилось весело:

J>
J>var _1 = 
J>    from _2 in DoBlaBlaAsync()
J>    from _3 in DoOtherBlaBlaAsync()
J>    from x in GetBlaBlaAsync()
J>    from _4 in DoWorkAsync(x)
J>    select 1;
J>


J>


Ага. И так можно что угодно заманадить
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 29.08.19 22:32
Оценка: +1 -1
Здравствуйте, Poopy Joe, Вы писали:

IT>>Без полноценной языковой поддержки монады бесполезны.

PJ>Очень полезны. С языковой поддержкой их просто удобнее использовать.

Не болтайте ерундой. Их главное предназначение устранять бойлерплейт код. Без языковой поддержки они сами по себе являются этим бойлерплейт кодом.
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Монады - пример где бы были полезны...
От: Shmj Ниоткуда  
Дата: 29.08.19 22:44
Оценка:
Здравствуйте, Poopy Joe, Вы писали:

PJ>Однозначно. Но есть одна опасность — еще не знаю ни одного человека, который был "познав ДАО" смог писать, без отвращение, на императивных языках.


Почему так?

Действительно ли функциональные языки упрощают разработку, или же лишь создают такую иллюзию в голове пользователя, поддерживаемую самовосхвалением и самовосхищением (что типа ты смог а 90% других — не могут)?

Какие есть реальные доказательства, в виде полноценных программ с множеством пользователей (т.е. доказавшие практикой результативность), написанные на Haskell или подобном?
Re[5]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 30.08.19 00:57
Оценка: 7 (5) +1
Здравствуйте, Shmj, Вы писали:

S>Т.е. Linq можно назвать монадой и никто не будет возражать?


Скорее всего будет. Linq синтаксис обеспечивает синтаксическую поддержку монадам, но сам монадой не является.

Монада — это абстракция, позволяющая организовывать цепочки вычислений таким образом, что-бы устранить из них boilerplate code.
Boilerplate code — это повторяющийся от вычисления к вычислению типовой код. Например, в монаде Future это создание и своевременный вызов callback функции, передача результата в следующую цепочку. В Maybe — упаковка, распаковка значения в контейнере, прерывание вычислений, если уже не надо. В List — преобразование двух последовательностей данных в одну. И т.д.

Для реализации монады нужно имплементировать монадный тип, методы return и bind. И тогда, если компилятор поддерживает монады, такой boilerplate code действительно исчезает с глаз.

Linq query comprehension syntax можно использовать для поддержки монад.

Для монады List в C# уже всё есть. Вот её использование в чистом виде.

var cities = new[]
{
    (name:"NYC",    streets: new[] { "1", "2", "3" }),
    (name:"Moscow", streets: new[] { "3", "5", "8" }),
};

var q =
    from c in cities
    from s in c.streets
    select c.name + " " + s;

foreach (var item in q)
{
    Console.WriteLine(item);
}


Монадным типом здесь является IEnumerable<T>. Методом bind метод со следующей сигнатурой:

public static IEnumerable<TResult> SelectMany<TSource,TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector)


Без return можно обойтись.

Если реализовывать монаду Maybe (Option), то в качестве монадного типа подойдёт что-то типа:

abstract class Maybe<T>
{
    public class Nothing : Maybe<T> {}
    public class Just : Maybe<T>
    {
        public T Value;
    }
}


И тогда реализация return и bind (и ещё вспомогальный метод для поддержки linq) будут такими:

// return
public static Maybe<T> ToMaybe<T>(this T value)
{
    return value == null ? (Maybe<T>)new Maybe<T>.Nothing() : new Maybe<T>.Just { Value = value };
}

// bind
public static Maybe<T2> SelectMany<T1,T2>(
    this Maybe<T1> source, Func<T1,Maybe<T2>> selector)
{
    if (source is Maybe<T1>.Just j) return selector(j.Value);
    return new Maybe<T2>.Nothing();
}

// специфика linq - типовой метод для всех монад
public static Maybe<T3> SelectMany<T1,T2,T3>(
    this Maybe<T1> source, Func<T1,Maybe<T2>> collectionSelector, Func<T1,T2,T3> resultSelector)
{
    return source.SelectMany(x => collectionSelector(x).SelectMany(y => resultSelector(x, y).ToMaybe()));
}


Здесь сигнатура метода SelectMany сменила IEnumerable<T> на Maybe<T> и в этом состоит весь прикол. Это такая малоизвестная фича C#.
Теперь можно использовать linq syntax:

var n =
    from c in 1.ToMaybe()
    from s in "2".ToMaybe()
    from x in 2.ToMaybe()
    select s + c + x;

Console.WriteLine(n);


Монаду Future тут уже был, но приведу ещё раз (без return ибо лень):

// bind
public static Task<T2> SelectMany<T1,T2>(
    this Task<T1> source, Func<T1,Task<T2>> selector)
{
    return source.ContinueWith(x => selector(x.Result)).Unwrap();
}

// вспомогательный метод, почти тоже самое что было в Maybe.
public static Task<T3> SelectMany<T1,T2,T3>(
    this Task<T1> source, Func<T1,Task<T2>> collectionSelector, Func<T1,T2,T3> resultSelector)
{
    return source.SelectMany(x => collectionSelector(x).SelectMany(y => resultSelector(x, y).ToTask()));
}


И использование

var t =
    from c in Task.FromResult(1)
    from s in Task.Run(() => "7" + c)
    select s + c;

Console.WriteLine(t.Result);


Всё это делать можно, но на мой взгляд годится только для объяснения что такое монады. Тем более, что большинство нужных монад в C# уже реализовано на уровне языка. А без ненужных мы как-нибудь проживём.
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Монады - пример где бы были полезны...
От: Shmj Ниоткуда  
Дата: 30.08.19 01:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Монада — это абстракция, позволяющая организовывать цепочки вычислений таким образом, что-бы устранить из них boilerplate code.

IT>Boilerplate code — это повторяющийся от вычисления к вычислению типовой код. Например, в монаде Future это создание и своевременный вызов callback функции, передача результата в следующую цепочку. В Maybe — упаковка, распаковка значения в контейнере, прерывание вычислений, если уже не надо. В List — преобразование двух последовательностей данных в одну. И т.д.

У вас талант объяснять, особенно хорошо заходит с примерами

Есть люди вроде и понимают, пытаются объяснить, пишут целые громадные статьи — а все-равно толком никто ничего понять не может.
Re[7]: Монады - пример где бы были полезны...
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 30.08.19 02:58
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Какие есть реальные доказательства, в виде полноценных программ с множеством пользователей (т.е. доказавшие практикой результативность), написанные на Haskell или подобном?


* Standard Chartered – 3M LOC на Haskell;
* Судя по текущей подборке вакансий на HH, в LK используют Haskell для KasperskyOS;
* GoJett (Uber на стероидах) — бэкэнд частично на Clojure;
* WhatsApp — бэкэнд на Erlang;
* Сбербанк – часть систем бэкэнда на Clojure;
* Tinkoff – часть систем бэкэнда на Scala.

Еще куча всякой мелочевки с Haskell, Clojure, Erlang/Elixir.
Отредактировано 30.08.2019 3:37 kaa.python . Предыдущая версия . Еще …
Отредактировано 30.08.2019 3:17 kaa.python . Предыдущая версия .
Отредактировано 30.08.2019 3:03 kaa.python . Предыдущая версия .
Отредактировано 30.08.2019 2:59 kaa.python . Предыдущая версия .
Re[4]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 30.08.19 05:18
Оценка:
Здравствуйте, IT, Вы писали:

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


IT>>>Без полноценной языковой поддержки монады бесполезны.

PJ>>Очень полезны. С языковой поддержкой их просто удобнее использовать.

IT>Не болтайте ерундой. Их главное предназначение устранять бойлерплейт код. Без языковой поддержки они сами по себе являются этим бойлерплейт кодом.


Фраза ни о чем. Это можно сказать вообще о любой абстракции. Какой конкретно языковой поддержки тебе не хватает для монад?
Re[7]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 30.08.19 05:36
Оценка:
Здравствуйте, Shmj, Вы писали:

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


PJ>>Однозначно. Но есть одна опасность — еще не знаю ни одного человека, который был "познав ДАО" смог писать, без отвращение, на императивных языках.


S>Почему так?

Потому что начинает не хватать выразительных возможностей императивных языков.

S>Действительно ли функциональные языки упрощают разработку, или же лишь создают такую иллюзию в голове пользователя, поддерживаемую самовосхвалением и самовосхищением (что типа ты смог а 90% других — не могут)?

Да, упрощают. Для самовосхваления и самовосхищения обратись к с++. Борьба с трудностями, ради борьбы с трудностями.
Но тут надо понимать, что сам язык это не серебряная пуля. При должном старании говнокодить можно на любом языке.

S>Какие есть реальные доказательства, в виде полноценных программ с множеством пользователей (т.е. доказавшие практикой результативность), написанные на Haskell или подобном?


В каком виде ты себе эти доказательства представляешь? Ну, посети любую fp конференцию и увидишь там много доказательств.
Re: Монады - пример где бы были полезны...
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.08.19 07:39
Оценка: +1 :))
Здравствуйте, Shmj, Вы писали:

S>Могли бы вы привести пример из жизни, где вы использовали монады не ради академической науки а для облегчения написания/поддержки кода?


S>Бывает такое?


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

любая последовательность команд где важен порядок делается монадой.
ветвления делаются монадой
ввод-вывод делается монадой
опции делаются монадой
обработка ошибок, в частности исключения делается монадой
парсинг делается монадой
ленивые вычисления делаются монадой
последовательность-коллекции тоже делаются монадой
многозадачные приседания делаются монадой
ООП делается ко-монадой

Вобщем все, что есть в обычном императивном программировании, в функциональном можно сделать или монадами, или без них.
Re[2]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 30.08.19 08:03
Оценка: -3
Здравствуйте, Ikemefula, Вы писали:

I>Разумеется. Монады в функциональном программировании делают все те вещи, которые в императивном доступны искаропки и о которых никто даже не задумывается:


Если обобщить, то можно сказать, что в императивном программировании не задумываются. Ну, так и результат соответствующий.
Re[5]: Монады - пример где бы были полезны...
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.08.19 08:20
Оценка:
Здравствуйте, Shmj, Вы писали:

S>
S>class Program {
S>    static void Main(string[] args) {
S>        AppInstance.Get().DoMain(IOMain);
S>    }
S>    static IO<None> IOMain() {
S>        return
S>            from _ in IO.Do(() => Console.WriteLine("What is your name?"))
S>            from name in IO.Do(() => Console.ReadLine())
S>            let message = "Hi, " + name + "!"
S>            from r in IO.Do(() => Console.WriteLine(message))
S>            select r;
S>    }
S>}
S>


S>В этом примере смысл ускользает...


S>Больше похоже что монады — позволяют писать в императивном стиле в языках функциональных. Т.е. для императивных это получается масло масляное — сначала вводите в императивный язык элементы функционального, затем на этих функциональных недо-элементах строите то, что встроено в язык изначально.


Именно! Но иногда это помогает, например, если ты захочешь использовать иммутабельные вычисления.
Re[7]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 08:58
Оценка: 2 (1)
S>Действительно ли функциональные языки упрощают разработку, или же лишь создают такую иллюзию в голове пользователя, поддерживаемую самовосхвалением и самовосхищением (что типа ты смог а 90% других — не могут)?

Функциональные подходы, а не языки, могут упростить разработку. Любой язык — это инструмент со своими границами применимости. После Эрланга мне сильно не хватает паттерн-матчинга и tail-call optimisation.

Реально работающие ФП-подходы постепенно проникают во все языки. Уже везде есть функции высшего порядка, например. Постепенно появляется pattern-matching и наиболее практичные монады. просачивается иммутабельность в виде библиотек. Ну и т.п.

S>Какие есть реальные доказательства, в виде полноценных программ с множеством пользователей (т.е. доказавшие практикой результативность), написанные на Haskell или подобном?


Есть. Достаточно походить на конференции, и тебя накормят тем насколько <любой из ФП> невероятно крут с гигатоннами использования и миллиардами сэкономленных денег, в зависимости от конференции. Люди начинают в этом вариться и реально в это верить. На практике, куда ни ткнешь, везде Java, Python, медленно подкрадывается Go. А <любой нишевый язык> применяется в единицах проектов командами, которые знают и любят этот язык, знают и люят предметную область и поэтому могут сворачивать горы.


dmitriid.comGitHubLinkedIn
Re[8]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 30.08.19 09:04
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Есть. Достаточно походить на конференции, и тебя накормят тем насколько <любой из ФП> невероятно крут с гигатоннами использования и миллиардами сэкономленных денег, в зависимости от конференции. Люди начинают в этом вариться и реально в это верить. На практике, куда ни ткнешь, везде Java, Python, медленно подкрадывается Go.


Т.е. если кто-то на конференции говорит, что вот мы в ... используем хаскель, ты в это не веришь, потому что куда ты не ткнешься везде питон?
Re[9]: Монады - пример где бы были полезны...
От: Mystic Artifact  
Дата: 30.08.19 09:05
Оценка: +1 :)
Здравствуйте, Poopy Joe, Вы писали:

PJ>Т.е. если кто-то на конференции говорит, что вот мы в ... используем хаскель, ты в это не веришь, потому что куда ты не ткнешься везде питон?


Конечно, на самом деле куда ни ткнешь — везде C++.
Re[9]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 09:22
Оценка: 6 (3) +1
M>>Есть. Достаточно походить на конференции, и тебя накормят тем насколько <любой из ФП> невероятно крут с гигатоннами использования и миллиардами сэкономленных денег, в зависимости от конференции. Люди начинают в этом вариться и реально в это верить. На практике, куда ни ткнешь, везде Java, Python, медленно подкрадывается Go.

PJ>Т.е. если кто-то на конференции говорит, что вот мы в ... используем хаскель, ты в это не веришь, потому что куда ты не ткнешься везде питон?


Нет. Начинаешь верить в невероятную крутость языка, как его можно и нужно везде использовать. А потом на проверку оказывается, что крутость сильно переоценена, а реальный мир пишет все или почти все то же самое на Java, Python'е и иногда Go. А некоторые типа Фейсбука и Гугла, еще и на С/C++.

А в тех местах, где «смотрите как мы круто используем ФП» на практике оказывается:

— есть ядро разработчиков, которое отлично знает и понимает соответсвующий ФП
— они накатили на этот ФП вагон и тележку патчей (как высокоуровневых так и низкоуровневых)
— не используют X% этого ФП (где X — любое значение)
— написали с нуля миллион библиотек и оберток

Как пример, тут рядом вон Standard Chartered
Автор: kaa.python
Дата: 30.08.19
упомянули. Его на РСДН уже упоминали
Автор: jazzer
Дата: 30.01.15
. Презентацию можно найти тут. ВНЕЗАПНО там:

— есть ядро разработчиков, которые отлично знают и понимают Хаскель
— In-house Haskell compiler: `Mu’.
— Writing lots of apps; services; libraries in Haskell.
— Собственный компилятор, чтобы был strict, а не lazy evaluation
— написали собственный эрланг, собственный memcached, собственную реляционную алгебру, собственную работу с датами, ....
и т.д. и т.п.

А так да – Хаскель используется, и вы тоже используйте, все будет хорошо :D


dmitriid.comGitHubLinkedIn
Отредактировано 30.08.2019 9:23 Mamut [ищите в других сетях] . Предыдущая версия .
Re[10]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 30.08.19 09:47
Оценка:
Здравствуйте, Mamut, Вы писали:


M>Нет. Начинаешь верить в невероятную крутость языка, как его можно и нужно везде использовать. А потом на проверку оказывается, что крутость сильно переоценена, а реальный мир пишет все или почти все то же самое на Java, Python'е и иногда Go. А некоторые типа Фейсбука и Гугла, еще и на С/C++.


Я не понял кем переоценена? Кто еще определяет крутость и полезность, кроме пользователей?
Ну да, реальный мир пишет на разных языках, как и почему это должно останавливать от перехода на тот же хаскель? Некоторые, типа фейсбука и гугла, так в каких-то своих проектах и сделали.

M>- есть ядро разработчиков, которое отлично знает и понимает соответсвующий ФП

M>- они накатили на этот ФП вагон и тележку патчей (как высокоуровневых так и низкоуровневых)
M>- не используют X% этого ФП (где X — любое значение)
M>- написали с нуля миллион библиотек и оберток

У тебя какая-то статистка в подтверждение есть или просто ветер так палец обдул?

M>ВНЕЗАПНО там:


Сова и глобус. Есть куча компаний которые просто используют. Пример. https://www.netscout.com/arbor-ddos я знаю ребят оттуда, начали сами, потому что затрахались со скалой. Теперь-то есть ядро экспертов, да.
https://www.youtube.com/watch?v=Z0vkQLLUVGw

M>А так да – Хаскель используется, и вы тоже используйте, все будет хорошо :D


Меня просто убивают подобные споры от профессионалов. Ну, блин, откатитесь на 30-40 лет назад, и, внезапно, все те же разговоры о пользе OOP. В 90м мне один чувак доказывал, что все это баловство и любое решение можно прекрасно написать на фортране. Он, разумеется, прав, любую программу можно написать даже на brainfuck.
Отредактировано 30.08.2019 9:49 Poopy Joe . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.