Монады - пример где бы были полезны...
От: Shmj Ниоткуда  
Дата: 29.08.19 02:29
Оценка: 1 (1) -1
Могли бы вы привести пример из жизни, где вы использовали монады не ради академической науки а для облегчения написания/поддержки кода?

Бывает такое?
Re: Монады - пример где бы были полезны...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.08.19 09:09
Оценка: 5 (4)
Здравствуйте, Shmj, Вы писали:

S> для облегчения написания/поддержки кода?


Ну когда на хаскеле пишешь, они повсеместно, просто потому что это основной способ написания кода, который меняет какое-то состояние, бросает ошибки и делает ввод-вывод. Это как прозой говорить.

А из более интересных применений, недавно на работе писал парсер с использованием библиотеки монадных парсер-комбинаторов megaparsec, там код выглядел так:
pLam = do   params <- pParamDefs
            kw "=>"
            (ty, exp) <- try pTypedExpr <|> pUntyped pExpr
            return $ Lam params ty exp

pTypedExpr = do
            ty <- pType
            kw ":"
            exp <- pExpr
            return (Just ty, exp)

pAssign = do
            (ty,name) <- pPossiblyTypedName
            kw "="
            exp <- pExpr
            return $ Assign ty name exp

pFunDef = do
            name <- pName
            lam <- pLam
            return $ Assign Nothing name lam

pExpr = pArray <|> try pTable <|> pBlock <|> try pIf <|> try pLam <|> try pLet <|> makeExprParser pTerm operatorTable

pTable = between (symbol "{") (symbol "}") (Table <$> listOf pField)

pField = do nm <- pName
            kw ":"
            e <- pExpr
            return (nm, e)
...

Тут код сразу описывает и грамматику, и построение типизированного AST из нее. Каждая строчка тут или успешно что-то парсит, продвигаясь вперед по тексту и порождая значения, или, если во входном тексте что-то другое, что эта строка не ожидает, прерывается и переходит к следующей альтернативе в выражениях с несколькими альтернативами (разделенными <|>), откатываясь назад в тексте, когда необходимо. Вся эта логика передачи управления туда-сюда и перемещения по входному тексту упрятана в монаду и do-нотацию, за счет чего код не перегружен механикой телодвижений, остается лишь существенная для задачи логика.
Re: Монады - пример где бы были полезны...
От: Jack128  
Дата: 29.08.19 09:24
Оценка: +1 -1
Здравствуйте, Shmj, Вы писали:

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


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


Бывает, но в haskel'е. Для того, чтоб монады были полезны на практике нужен high kinded polimorphism, которого в жаба-шарпах нету
Re: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 29.08.19 09:31
Оценка: 5 (3) +4
S>Могли бы вы привести пример из жизни, где вы использовали монады не ради академической науки а для облегчения написания/поддержки кода?

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


Монады — они везде. Только Хаскелисты хотят, чтобы они были строго и матиематически верны определению и реализации, что есть в Хаскеле. На практике достаточно и такого определения: https://github.com/hemanth/functional-programming-jargon#monad

Собственно, емнип, практически монадой (или ис пользующим монады) является любой код, который позволяет делать


Result1 = f1()
Result2 = f2(Result1)
Result3 = f3(Result2)
...
ResultN = fN(ResultN-1)

if ResultN is Error:
  return Error
else:
  return ResultN


И такой код где-нибудь рано или поздно пишут все


dmitriid.comGitHubLinkedIn
Re[2]: Монады - пример где бы были полезны...
От: takTak  
Дата: 29.08.19 09:41
Оценка:
S>>Могли бы вы привести пример из жизни, где вы использовали монады не ради академической науки а для облегчения написания/поддержки кода?

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


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


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

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

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

с помощью Maybe / Option / Either- монад его можно переписать во что-то более удобочитаемое,
а о чём именно говоришь ты?
Re[3]: Монады - пример где бы были полезны...
От: Jack128  
Дата: 29.08.19 10:05
Оценка:
Здравствуйте, takTak, Вы писали:

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


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


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


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


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


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

T>с помощью Maybe / Option / Either- монад его можно переписать во что-то более удобочитаемое,
T>а о чём именно говоришь ты?

FileStream fileStream = new FileStream(...)
fileStream.WriteString("BlaBla")
как тут поможет обычный полиморфизм ?? да никак. Но он поможет если ты хочешь писать строки и в файл и в сеть и в память.
Так и с монадами. Ну ясно что у тя тут монада Maybe(nullable) — но для упрощения этого кода само понятие монад не нужно, нужно тупо захардкорить в язык операции над nullable (как это сделали в шарпе) и получить a?.Prop?.MyMethod();

А если ты хочешь написать код работающий с любыми монадами — вот тут становится интереснее

Вот тебе пример на псевдо шарпе, который умеет:
1) хай кайндед полимофизм.
2) умеет неявно lift'идь операторы для любого монадического типа, а не только для Nullable<> как сейчас. Тo есть M<int> a, b; a + b — преобразует в a.bind(x => b.bind(y => new M<int>(x + y)))
Теоретически я бы мог использовать query syntax, который суть — аналог do натации в haskel'е, но это сильно раздуло бы код, скрывая смысл.


M<int> Average<M<_>>(IEnumerable<M<int>> ints) {
   var sum = new M(0);
   var count = 0;
   foreach(var v in ints) {
      sum = sum + v;
      count++;
   }
   return count > ? (sum / count) : new M<int>(0);
}


Думаю понятно что эта функция делает.

теперь попробует её использовать:
IEnumerable<int> items = ....;
// Identity - то монада Identity. Хотя опять же для удобства иcпользования можно было бы считать, что любой тип сам по себе является монадой Identity, чтоб не делать подобных приседаний
Console.WriteLine(Average(items.Select(x => new Identity(x))));


IEnumerable<Nullable<int>> items2 = File.ReadAllLines("1.txt").Select(TryParseInt); // TryParseInt имеет сигнатуру int? TryParseInt(string s);
Console.WriteLine(Average(items2)); // если какая то строка не является числом - получится null


IEnumerable<Task<int>> items3 = new[] { GetIntAsync("www.google.com"), GetIntAsync("www.bind.com"), GetIntAsync("www.ya.ru") } ;
Console.WriteLine(await Average(items3));
Отредактировано 29.08.2019 10:07 Jack128 (Опечатка) . Предыдущая версия .
Re: Монады - пример где бы были полезны...
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.08.19 11:14
Оценка:
Здравствуйте, Shmj, Вы писали:

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

S>Бывает такое?
Бывает:
List, Parser, Future, Maybe, один раз получилась error-монада
Ну и если цацкель, то там IO-монада, без нее никуда.
Re[4]: Монады - пример где бы были полезны...
От: takTak  
Дата: 29.08.19 11:57
Оценка:
J>А если ты хочешь написать код работающий с любыми монадами — вот тут становится интереснее

J>Вот тебе пример на псевдо шарпе, который умеет:

J>1) хай кайндед полимофизм.
J>2) умеет неявно lift'идь операторы для любого монадического типа, а не только для Nullable<> как сейчас. Тo есть M<int> a, b; a + b — преобразует в a.bind(x => b.bind(y => new M<int>(x + y)))
J> Теоретически я бы мог использовать query syntax, который суть — аналог do натации в haskel'е, но это сильно раздуло бы код, скрывая смысл.


J>
J>M<int> Average<M<_>>(IEnumerable<M<int>> ints) {
J>   var sum = new M(0);
J>   var count = 0;
J>   foreach(var v in ints) {
J>      sum = sum + v;
J>      count++;
J>   }
J>   return count > ? (sum / count) : new M<int>(0);
J>}
J>


J>Думаю понятно что эта функция делает.


J>теперь попробует её использовать:

J>
J>IEnumerable<int> items = ....;
J>// Identity - то монада Identity. Хотя опять же для удобства иcпользования можно было бы считать, что любой тип сам по себе является монадой Identity, чтоб не делать подобных приседаний
J>Console.WriteLine(Average(items.Select(x => new Identity(x))));
J>



про монаду Identity я совсем не понял, зачем она вообще?


lift'идь — это перевести к монадическому виду?

т.е. польза от "хай кайндед полимофизм" в том, что нужно меньше проверки типов или что-то другое?
Re[5]: Монады - пример где бы были полезны...
От: Jack128  
Дата: 29.08.19 14:06
Оценка:
Здравствуйте, takTak, Вы писали:


T>про монаду Identity я совсем не понял, зачем она вообще?


Ну монада — это что то типа интерфейса c методом bind, а Identity — реализация этого интерфейса. Я там выше написал во что транслируется код a + b. Если a имеет тип int, то такая трансформация невозможно, потому что у типа int нету метода bind. Значит нам нужна обертка с таким методом. Я написал её явно, но потенциально за меня её мог бы сгенерить компилятор.

T>lift'идь — это перевести к монадическому виду?


lift'инг операторов в c# — это возможность использовать операторы с типом Nullable<T>, если эти операторы определены для типа Т.
То есть так как для типа int определён оператор + , то я могу написать Nullable<int> x, y; x + y.
А у типа struct A {} оператора + нету, поэтому Nullable<A> x, y; x + y — не скомпилируется. Выше я пожелал чтоб операторы лифтились не только для NUllable, а для любого монадического типа

T>т.е. польза от "хай кайндед полимофизм" в том, что нужно меньше проверки типов или что-то другое?


Польза в том же, что и польза от обычных дженериков, но немного на другом уровне. Эта концепция вообще говоря к монадам отнашения не имеет. ТО есть может существовать и приносить пользу без них, а вот монадам без HKP(high kinded polimorphism) — туго.

Вернемся к примеру со средним. Немного изменю его
M<double> Average<M<_>>(IEnumerable<M<int>> ints) {
   var sum = new M<double>(0.0);
   var count = 0;
   foreach(var v in ints) {
      sum = sum + v;
      count++;
   }
   return count > ? (sum / count) : new M<double>(0);
}

то есть если я передал список Nullable<int> то на выходе должен получить Nullable<double> . Если на входе список из Task<int> то на выходе Task<double> должен быть. Обычными дженериками такого не добьёшься. А вот шаблонами из С++ наcколько я понимаю можно.

Вот этот момент, то что я дженериком аргументом передаю не конкретный тип (ну например Nullable<int>), а open generic type — вот это и есть полимофизм высшего порядка
Отредактировано 29.08.2019 14:12 Jack128 . Предыдущая версия .
Re: Монады - пример где бы были полезны...
От: scf  
Дата: 29.08.19 14:17
Оценка:
Здравствуйте, Shmj, Вы писали:

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


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


Я активно использую монады в Scala.

Это математическая абстракция и её сложно понять без программирования, примерно как сложно понять концепцию функций высшего порядка, пока не скажешь, что forEach() — это функция высшего порядка.

Монады — они везде. Например, джавовые Optional и CompletableFuture — монады. скаловские Option, Either, Future — монады. cats IO, monix Task, scalaz ZIO — тоже монады.

Вот моя несколько однобокая попытка рассказать, что такое монада: https://habr.com/ru/post/454534/
Re[5]: Монады - пример где бы были полезны...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.08.19 14:23
Оценка:
Здравствуйте, takTak, Вы писали:

T>т.е. польза от "хай кайндед полимофизм" в том, что нужно меньше проверки типов или что-то другое?


Польза в том, что можно писать обобщенный код, работающий с разными "контейнерами", т.е. абстрагироваться не только от типа элементов (как обычно в языках с генериками), но и от обобщенных типов контейнеров, получается дважды генерик — генерик, у которого параметр сам генерик. Или языком С++ шаблон, у которого есть параметр-шаблон.

Например, я пишу такую функцию:
> pair a b = return (a,b)

Ее тип автоматически выводится такой:
pair :: Monad m => a -> b -> m (a, b)


Она берет на вход два значения типов a и b, делает из них тупл (a, b) и заворачивает его в монаду ("контейнер") m.
А вот какую именно — тут я пока не указываю, я могу передать тип "контейнера" позже, при вызове. Так я могу получить список с туплом в виде единственного элемента

> pair 2 3 :: [(Int, Int)]
[(2,3)]

(после :: указывается тип, квадратные скобки означают список)

А могу опциональное значение Just с туплом внутри.
> pair 2 False :: Maybe (Int, Bool)
Just (2,False)


А могу и вовсе функцию из чего-то третьего в такой тупл:
> q = pair "hello" True :: Int -> (String, Bool)
> q 3
("hello",True)

Т.е. в зависимости от переданных типов аргументов и типа "контейнера", моя функция строит очень разные вещи, она опирается на ф-ю return из интерфейса переданной монады чтобы построить завернутое значение.

Теперь, что, если я не хочу никакой особый контейнер, а хочу вызвать мою ф-ю pair и получить тупл без заворачивания его в список, мэйби или еще что-нибудь хитрое? Мне надо передать какую-то монаду, но она не должна ничего особенного делать, просто содержать значение как есть. Это и есть монада Identity. Аналог struct Identity<T> { T value; }
Re[6]: Монады - пример где бы были полезны...
От: takTak  
Дата: 29.08.19 14:40
Оценка:
T>>т.е. польза от "хай кайндед полимофизм" в том, что нужно меньше проверки типов или что-то другое?

DM>Польза в том, что можно писать обобщенный код, работающий с разными "контейнерами", т.е. абстрагироваться не только от типа элементов (как обычно в языках с генериками), но и от обобщенных типов контейнеров, получается дважды генерик — генерик, у которого параметр сам генерик. Или языком С++ шаблон, у которого есть параметр-шаблон.


ок, где-то на интуитивном уровне я это понимаю, но я до сих пор не могу понять другого: читается ли вообще написанный таким образом код? Ведь если я насoздaвал кучу типов для того, чтоб различать между ними, то это,наверное, из-за того, что я структурирую модель определённым образом, если же есть конструкт, который работает с любыми контейнерами одинаково (кстати, что там с проверкой типов при HKP), то как такой код вообще кто-то может позже понять ? приведённые примеры понятны, но это как бы на уровне "хеллоу вёд", как это всё выглядит в промышленном масштабе или даже если ты сам смотришь на что-то написанное тобой пару месяцев назад? есть такой опыт?



DM>Теперь, что, если я не хочу никакой особый контейнер, а хочу вызвать мою ф-ю pair и получить тупл без заворачивания его в список, мэйби или еще что-нибудь хитрое? Мне надо передать какую-то монаду, но она не должна ничего особенного делать, просто содержать значение как есть. Это и есть монада Identity. Аналог struct Identity<T> { T value; }


т.е. Identity просто заворачивает значение так, что с полученным конейнером можно работать привычными функциональными способами типа map, bind etc?
Re[7]: Монады - пример где бы были полезны...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.08.19 15:35
Оценка: 2 (1)
Здравствуйте, takTak, Вы писали:


T>ок, где-то на интуитивном уровне я это понимаю, но я до сих пор не могу понять другого: читается ли вообще написанный таким образом код? Ведь если я насoздaвал кучу типов для того, чтоб различать между ними, то это,наверное, из-за того, что я структурирую модель определённым образом, если же есть конструкт, который работает с любыми контейнерами одинаково (кстати, что там с проверкой типов при HKP), то как такой код вообще кто-то может позже понять ? приведённые примеры понятны, но это как бы на уровне "хеллоу вёд", как это всё выглядит в промышленном масштабе или даже если ты сам смотришь на что-то написанное тобой пару месяцев назад? есть такой опыт?


Дело привычки. Поначалу может быть сложно, потом становится обычным делом. Чаще всего такой обобщенный код возникает там, где надо принимать функцию, и хочется разрешить не только чистые ф-ии, но и с эффектами. А какие там эффекты заранее не знаешь, но они как раз монадами кодируются.
Скажем, есть у нас функция выбора подпоследовательности из списка по заданному предикату:
filter  ::              (a ->   Bool) -> [a] ->   [a]

А мы хотим, чтобы наш предикат не просто возвращал Bool, а еще писал что-то в лог, или считал какую-то статистику. Такая функция-предикат для интов может иметь тип
Int -> IO Bool
или
Int -> SomeState Bool
или еще какой эффект иметь. Нам пофиг какой, если этот эффект вписывается в интерфейс монады. Тогда делаем обобщенную ф-ию
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]

которая умеет применять предикат с эффектом, и сама тоже этим эффектом становится заражена.

Такие ф-ии обычно небольшие и несложные, вполне можно разобраться.

Другой частый вариант абстрагирования от монад — когда нужно объединить несколько эффектов. Для этого можно параметром монады с одним эффектом сделать другую монаду (заранее не знаем какую), которая будет описывать другие эффекты. Тогда их можно сложить в такой слоеный пирог. Это монадные трансформеры. К ним тоже быстро привыкаешь.

T>т.е. Identity просто заворачивает значение так, что с полученным конейнером можно работать привычными функциональными способами типа map, bind etc?


Да, просто содержит какое-то значение без изменений, при этом реализуя все необходимые интерфейсы "контейнера"/"эффекта".
Re[8]: Монады - пример где бы были полезны...
От: takTak  
Дата: 29.08.19 15:49
Оценка:
DM>Такие ф-ии обычно небольшие и несложные, вполне можно разобраться.

DM>Другой частый вариант абстрагирования от монад — когда нужно объединить несколько эффектов. Для этого можно параметром монады с одним эффектом сделать другую монаду (заранее не знаем какую), которая будет описывать другие эффекты. Тогда их можно сложить в такой слоеный пирог. Это монадные трансформеры. К ним тоже быстро привыкаешь.


если несложные, то в чём профит? ведь можно было бы просто обернуть несколько вспомогательных функций вокруг основной, то и эффект был бы тот тоже, или нет?

а что за сфера-то, если не секрет, где ты хаскель в коммерческом плане используешь, если я , конечно, правильно понял ?
Re[9]: Монады - пример где бы были полезны...
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.08.19 16:34
Оценка:
Здравствуйте, takTak, Вы писали:

T>если несложные, то в чём профит? ведь можно было бы просто обернуть несколько вспомогательных функций вокруг основной, то и эффект был бы тот тоже, или нет?


Если исходная ф-я (как filter выше) чистая, то передать в нее свои грязные функции просто не выйдет, как ни заворачивай. Потому и делают в библиотеках в дополнение к чистым комбинатором еще такие, что работают с произвольными монадами, чтобы люди могли свои ф-ии с эффектами тоже там использовать. Можно, конечно, каждый раз заново все реализовать для каждого типа, но это какой-то Go получится. В ФП такое не любят.

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


Это у меня сейчас исследовательский проектик по выводу типов для языка
Автор: D. Mon
Дата: 25.04.19
, который внутри конторы используется.
Re: Монады - пример где бы были полезны...
От: omgOnoz  
Дата: 29.08.19 17:41
Оценка:
Здравствуйте, Shmj, Вы писали:

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


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


Сначала я думал, что монады — это ругательство.

Потом я научился Scala-е, а уже после узнал, что я использую монады и это не ругательство
Отредактировано 29.08.2019 17:44 omgOnoz . Предыдущая версия .
Re[2]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 29.08.19 19:01
Оценка:
Здравствуйте, Jack128, Вы писали:

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


Кое-что есть в достаточной степени, чтобы кое-как кривенько поддерживать монады.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 29.08.19 19:02
Оценка: -2
Здравствуйте, Shmj, Вы писали:

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


Без полноценной языковой поддержки монады бесполезны.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Монады - пример где бы были полезны...
От: Jack128  
Дата: 29.08.19 20:29
Оценка: +1
Здравствуйте, IT, Вы писали:

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


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


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


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

Получилось весело:
var _1 = 
    from _2 in DoBlaBlaAsync()
    from _3 in DoOtherBlaBlaAsync()
    from x in GetBlaBlaAsync()
    from _4 in DoWorkAsync(x)
    select 1;


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

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

Очень полезны. С языковой поддержкой их просто удобнее использовать.
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 . Предыдущая версия .
Re[11]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 11:05
Оценка:
PJ>Ну да, реальный мир пишет на разных языках, как и почему это должно останавливать от перехода на тот же хаскель? Некоторые, типа фейсбука и гугла, так в каких-то своих проектах и сделали.

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


Только мой опыт и описания практически любого «мегакрутого» проекта с презентаций и конференций.

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


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


Затрахались с одним языком, описываемым, какой он крутой, и решили перейти на другой


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

PJ>Меня просто убивают подобные споры от профессионалов. Ну, блин, откатитесь на 30-40 лет назад, и, внезапно, все те же разговоры о пользе OOP. В 90м мне один чувак доказывал, что все это баловство и любое решение можно прекрасно написать на фортране. Он, разумеется, прав, любую программу можно написать даже на brainfuck.

Твое возражение даже возражением нельзя назвать. Какой-то набор бессвязных «ты не прав потому что».


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


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


M>Только мой опыт и описания практически любого «мегакрутого» проекта с презентаций и конференций.


Ну, я примерно так и подумал.

M>Затрахались с одним языком, описываемым, какой он крутой, и решили перейти на другой


Упражнение в остроумии?

M>Твое возражение даже возражением нельзя назвать. Какой-то набор бессвязных «ты не прав потому что».


Возражение? А на что у тебя возражать? На фантазии и предрассудки?
Мне просто показалось забавным цикличность с которой люди оправдывают свое нежелание отбросить устаревший опыт.
Re[13]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 11:36
Оценка: +1
PJ>Возражение? А на что у тебя возражать? На фантазии и предрассудки?

Это опыт, сын ошибок трудных

PJ>Мне просто показалось забавным цикличность с которой люди оправдывают свое нежелание отбросить устаревший опыт.


Мой «устаревший опыт» включает в себя два десятка языков программирования, включая ФП. На сказочников про крутость и невероятность <любой ЯП> я давно смотрю с усмешкой.


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

M>Это опыт, сын ошибок трудных


Твой опыт по ощупыванию жопы слона и глубокие выводы о его привычках.

PJ>>Мне просто показалось забавным цикличность с которой люди оправдывают свое нежелание отбросить устаревший опыт.


M>Мой «устаревший опыт» включает в себя два десятка языков программирования, включая ФП. На сказочников про крутость и невероятность <любой ЯП> я давно смотрю с усмешкой.


А мартышка попробовала с полдюжины очков. Числа сами по себе не всегда впечатляют.
Если на всех на них писать как на фортране, то ничего лучше фортрана и не найти никогда. Функциональность это про композицию и типы, в основном. А тебе не хватает только паттерн матчинга. Вот такой твой опыт. Ну усмехайся, чё.
Re[8]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 30.08.19 13:37
Оценка: 7 (3)
Здравствуйте, Mamut, Вы писали:

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


Где? В C#? Как тебе такое?

https://github.com/igor-tkachev/Linq.Expressions.Deconstruct
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 19:30
Оценка:
M>>Функциональные подходы, а не языки, могут упростить разработку. Любой язык — это инструмент со своими границами применимости. После Эрланга мне сильно не хватает паттерн-матчинга и tail-call optimisation.

IT>Где? В C#? Как тебе такое?


IT>https://github.com/igor-tkachev/Linq.Expressions.Deconstruct


Интересно, но многословно и не встроено в язык. Это скорее всего нельзя использовать в определении функции, например. На уровне языка он мееееееедленно проникает в C#, но все еще в сильно ограниченном виде: https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching


dmitriid.comGitHubLinkedIn
Re[15]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 19:31
Оценка:
PJ>Твой опыт по ощупыванию жопы слона и глубокие выводы о его привычках.
PJ>А мартышка попробовала с полдюжины очков. Числа сами по себе не всегда впечатляют.
PJ>Если на всех на них писать как на фортране, то ничего лучше фортрана и не найти никогда. Функциональность это про композицию и типы, в основном. А тебе не хватает только паттерн матчинга. Вот такой твой опыт. Ну усмехайся, чё.

Во-во. Именно такие люди с горящими глазами в огромном количестве присутствуют на конференциях по ФП.


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

PJ>>Твой опыт по ощупыванию жопы слона и глубокие выводы о его привычках.

PJ>>А мартышка попробовала с полдюжины очков. Числа сами по себе не всегда впечатляют.
PJ>>Если на всех на них писать как на фортране, то ничего лучше фортрана и не найти никогда. Функциональность это про композицию и типы, в основном. А тебе не хватает только паттерн матчинга. Вот такой твой опыт. Ну усмехайся, чё.

M>Во-во. Именно такие люди с горящими глазами в огромном количестве присутствуют на конференциях по ФП.

И только ты туда ходишь рассказать им какие они дебилы?!
Re[17]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 19:57
Оценка:
PJ>>>Твой опыт по ощупыванию жопы слона и глубокие выводы о его привычках.
PJ>>>А мартышка попробовала с полдюжины очков. Числа сами по себе не всегда впечатляют.
PJ>И только ты туда ходишь рассказать им какие они дебилы?!

Если люди общаются только в таком стиле, что еще остается рассказывать?


dmitriid.comGitHubLinkedIn
Re[10]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 30.08.19 20:07
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Интересно, но многословно и не встроено в язык.


Почему не встроено? Это C# 8 preview. Вон даже appveyor ещё фэйлится по причине отсутствия у них там последней версии.
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Монады - пример где бы были полезны...
От: IT Россия linq2db.com
Дата: 30.08.19 20:11
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Интересно, но многословно...


Оставлю здесь

[Test]
public void ConstantFoldingTest()
{
    Expression<Func<int,int>> f = i => i * 0 + 0 + i + 10 * (i * 0 + 2);

    var f1 = f.TransformEx(ex => ex switch
    {
        Multiply(Constant(0) e,   _)               => e,               // 0 * e => 0
        Multiply(_,               Constant(0) e)   => e,               // e * 0 => 0
        Multiply(Constant(1),     var e)           => e,               // 1 * e => e
        Multiply(var e,           Constant(1))     => e,               // e * 1 => e
        Divide  (Constant(0) e,   _)               => e,               // 0 / e => 0
        Divide  (var e,           Constant(1))     => e,               // e / 1 => e
        Add     (Constant(0),     var e)           => e,               // 0 + e => e
        Add     (var e,           Constant(0))     => e,               // e + 0 => e
        Subtract(Constant(0),     var e)           => Negate(e),       // 0 - e => -e
        Subtract(var e,           Constant(0))     => e,               // e - 0 => e
        Multiply(Constant(int x), Constant(int y)) => Constant(x * y), // x * y => e
        Divide  (Constant(int x), Constant(int y)) => Constant(x / y), // x / y => e
        Add     (Constant(int x), Constant(int y)) => Constant(x + y), // x + y => e
        Subtract(Constant(int x), Constant(int y)) => Constant(x - y), // x - y => e
        _                                          => ex
    });

    Assert.IsTrue(f1.EqualsTo(i => i + 20));
}


Что здесь лишнее, что можно было бы убрать?
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 20:14
Оценка:
M>>Интересно, но многословно и не встроено в язык.
IT>Почему не встроено? Это C# 8 preview. Вон даже appveyor ещё фэйлится по причине отсутствия у них там последней версии.

А. Мне показалось, что это им енно твоя библиотека реализует паттерн матчинг в виде надстройки. Про то, что в C# появляется я написал

На уровне языка он мееееееедленно проникает в C#, но все еще в сильно ограниченном виде


Но проникают!


dmitriid.comGitHubLinkedIn
Re[11]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 30.08.19 20:16
Оценка:
IT>Что здесь лишнее, что можно было бы убрать?\

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

А в реальности ты используешь встроенные в язык паттерн матчинг для по AST функции.

Пятница, поздно, во мне Поэтому не сразу дошло.


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

PJ>>>>Твой опыт по ощупыванию жопы слона и глубокие выводы о его привычках.

PJ>>>>А мартышка попробовала с полдюжины очков. Числа сами по себе не всегда впечатляют.
PJ>>И только ты туда ходишь рассказать им какие они дебилы?!

M>Если люди общаются только в таком стиле, что еще остается рассказывать?


Ну да, я за вами три дня скакала, чтобы сказать как вы мне безразличны.
В каком таком? Это ты, весь в белом, на гора выдаешь тайное знание, о том, что все тлен и пустое, реальных проектов нет, всем можно расходиться.
Re[19]: Монады - пример где бы были полезны...
От: Mamut Швеция http://dmitriid.com
Дата: 31.08.19 09:53
Оценка:
PJ>Ну да, я за вами три дня скакала, чтобы сказать как вы мне безразличны.

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


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

PJ>>Ну да, я за вами три дня скакала, чтобы сказать как вы мне безразличны.


M>Пишет мне человек, который уже вторые сутки из кожи лезет вон, чтобы попытаться меня оскорбить.


Вот это сейчас было смешно. Желающий оскорбиться ищет повод. Неужели сомнение в абсолютности твоего печального опыта с ФП повергло тебя в такой шок?
Re[21]: Монады - пример где бы были полезны...
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 02.09.19 08:17
Оценка: +2
Здравствуйте, Poopy Joe, Вы писали:

M>>Пишет мне человек, который уже вторые сутки из кожи лезет вон, чтобы попытаться меня оскорбить.


PJ>Вот это сейчас было смешно. Желающий оскорбиться ищет повод. Неужели сомнение в абсолютности твоего печального опыта с ФП повергло тебя в такой шок?


Лет десять назад Мамут топил за ФП очень аргументировано. Для сравнения, в этом треде из тебя в основном эмоции лезут, конструктива около нуля.
Re[22]: Монады - пример где бы были полезны...
От: Poopy Joe Бельгия  
Дата: 02.09.19 09:40
Оценка: -1
Здравствуйте, Ikemefula, Вы писали:

I>Лет десять назад Мамут топил за ФП очень аргументировано. Для сравнения, в этом треде из тебя в основном эмоции лезут, конструктива около нуля.


"Топить" за что-то можно в разговоре с коллегами, когда их работа влияет на тебя. Можно объяснять желающим слушать. Топить в священных войнах, где никто не собирается менять точку зрения, немного слабоумно, на мой вкус и точно бесполезно. Весь конструктив уже 100500 раз изложен в различных статьях, смысла повторять которых нет.

А любопытства ради, можно ссылку на тот топик?
Re[11]: Монады - пример где бы были полезны...
От: Ночной Смотрящий Россия  
Дата: 10.09.19 09:22
Оценка:
Здравствуйте, Poopy Joe, Вы писали:

PJ>Меня просто убивают подобные споры от профессионалов. Ну, блин, откатитесь на 30-40 лет назад, и, внезапно, все те же разговоры о пользе OOP.


Ну так и результат такой же. ООП тащат уже больше по инерции, реальной его применимости, особенно тяжеловесных фич вроде полиморфизма и наследования не так уж и много.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Монады - пример где бы были полезны...
От: Mr.Delphist  
Дата: 11.09.19 11:19
Оценка:
Здравствуйте, omgOnoz, Вы писали:

O>Сначала я думал, что монады — это ругательство.


O>Потом я научился Scala-е, а уже после узнал, что я использую монады и это не ругательство


Как говаривал классик, "а я и не знал, что всю жизнь ругаюсь монадами"
Re: Монады - пример где бы были полезны...
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.09.19 18:03
Оценка:
Здравствуйте, Shmj, Вы писали:

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


http://rsdn.org/forum/philosophy/2340340
Автор: BulatZiganshin
Дата: 08.02.07
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.