Крылатый
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0650r0.pdf
Крылатый
Ой вей!
Nikita
очередная серия #WhatElseShouldWeAddToTheFuckingLanguage
Крылатый
Ну монадки в разных вариациях пытаются воткнуть.
Nik
Плюсы становятся все более и более монструозными.
Крылатый
Да нет.
Крылатый
Эти пропозалы не приняты же.
Berkus
expected<int,error_condition> f(int i, int j, int k) { return monad::bind(safe_divide(i, k), [=](int q1) { return functor::transform(safe_divide(j,k), [=](int q2) { return q1+q2; }); }); } OUCH
Крылатый
Слишкома мало autp
Крылатый
auto*
Berkus
да все равно адочек
доня.
ну, ввели монады - надо do-нотацию ввести
доня.
вот тогда будет норм :3
Крылатый
do нотация была бы к месту, будь тут синтаксис как в хаскеле...
доня.
типа do { q1 <- safe_divide(i, k); q2 <- safe_divide(j, k); return unit(q1 + q2) }
Berkus
vpis do {
Berkus
типа do { q1 <- safe_divide(i, k); q2 <- safe_divide(j, k); return unit(q1 + q2) }
это получше выглядит чем ад в пропозале
Крылатый
типа do { q1 <- safe_divide(i, k); q2 <- safe_divide(j, k); return unit(q1 + q2) }
auto x = [i, j, k]{ auto x = safe_divide(i, k); auto y <- safe_divide(j, k); return unit(q1 + q2); }();
Крылатый
Ну, щитай почти так.
Крылатый
do нотация это жеж императивный сахар.
Крылатый
А нам сюда скорей нужен... chain
Крылатый
Мол fuck(tits) >> wash >> show
Крылатый
:3
доня.
ну это всё через монадки работает ща, вот допустим есть монада Maybe<T>, принимающая значение либо Just(T), либо Nothing (типобезопасный аналог nullable значений) так вот, пусть у тебя есть два числа, завёрнутые в Maybe, и ты хочешь их сложить как ты это делаешь без do-нотации: mx = Just(42); my = Just(3); mx.bind(x => my.bind(y => Just(x + y))); // на выходе Just(45); соответственно если где-то в примере выше вместо допустим Just(3) будет Nothing, то и последняя строка будет Nothing, вот а теперь то же самое с do-нотацией: do { x <- Just(42); y <- Just(3); return Just(x + y); }
доня.
это я отвечал на сообщение что чем это отличается от анонимного скоупа, но его удалили
доня.
в общем, отличается тем, что <- внутри блока do "распаковывает" значение из монадки
доня.
do нотация это жеж императивный сахар.
ничего императивного в do-нотации нет так-то
доня.
(надеюсь меня не забанят за монадки в цепепе-чате 😄)
Крылатый
ML/C++
Крылатый
Неплохой вышел бы гибрид.
Berkus
хых, template ml
Крылатый
Дыа.
доня.
доня.
ну что-то похожее на do-нотацию по сути
🐙 Antony
поведение try должно настраиваться какими-то трейтами, которые может пользователь специализировать
🐙 Antony
тоессть может и для future, и для optional, и для expected работать
🐙 Antony
Но предложение сильно сырое, кажется что даже класс expected на ближаёшем собрании не одобрят
Constantine
А можно краткий курс как это должно работать (для чайников)?
Constantine
https://en.m.wikibooks.org/wiki/Haskell/do_notation
А в более человеческой форме?) Подразумевается, что expected<Type, ErrorType> это Type либо ErrorType? Конструкция типа выше должна работать за счет неявного if () проверяющего на ErrorType и если ошибка возвращая ErrorType? Такой альтернативный способ записи строгих исключений?
Vladislav
Да, да, да
Constantine
а как обходиться без wrap-блоков?
Constantine
в смысле, ошибка может нуждаться в контекстно-зависимом уточнении
Berkus
есть chain, в него ошибка проваливается - если в первой операции сломалось, остальные не выполняются
Berkus
уточнение ты сделал когда возвращал expected<,Error>
Constantine
у меня есть метод template <Type> expected<std::notrolls::not_null_unique_ptr<Type>, std::out_of_memory_exception> deep_clone(std::notrolls::not_null_unique_ptr<Type> object); его ошибка недостаточно показательна
Berkus
Господин Полухин показывал возможный пропозал для уточнения эксепшенов, используй его.
Berkus
https://stackoverflow.com/questions/44858395/why-is-the-template-specialization-not-chosen хех
Berkus
Фраза, содержащая 0 информации.
как и твоя, так что остынь
Constantine
как и твоя, так что остынь
я просто не понимаю, зачем нужна реплика в духе "загугли не знаю что", если человек изначально запрашивает обзорные сведения
Berkus
bad_alloc достаточно показательная ошибка, так что непонятно чего ты хотел вообще
Крылатый
Продолжаем день монад! http://www.fluentcpp.com/2017/07/11/dealing-multiple-paths-vector-monad-c/
Constantine
bad_alloc достаточно показательная ошибка, так что непонятно чего ты хотел вообще
ну да, я такой сижу и вижу bad_alloc в продакшене на запуске 20к строк кода и сразу понял, где я случайно использовал в 20 раз больше памяти, чем надо
Stanislav
https://github.com/LoopPerfect/neither
Berkus
https://github.com/LoopPerfect/neither
этот кстати довольно мелкий!
Constantine
когда бросаешь, делай throw bad_alloc() << __FILE__ << __LINE__; и не жужжи
ага, у меня ошибка в методе deep_clone, ну теперь заживем
Berkus
ты себя не зря в std::trolls:: засунул, прямо сочится из монитора
Крылатый
https://github.com/LoopPerfect/neither
Могу и своего добавить! https://github.com/raeper/aim/blob/master/headers/monad.hpp
Constantine
добавь << backtrace();
а теперь если я захочу программно обрабатывать случай когда bad_alloc происходит в объекте, который может освободиться пулом параллельного потока и тогда retry?
Крылатый
Могу и своего добавить! https://github.com/raeper/aim/blob/master/headers/monad.hpp
Увидете ошибки в тексте — скажите, пожалйуста? Я поправлю.
Крылатый
> в тексте > 3.5 строчки комментов
Berkus
это NP-полная проблема, нерешаемо
Constantine
это мне?))))
Berkus
возможно
Berkus
> Tools for creating Tools to create
Berkus
> Resulting container is always has Resulting container always has
Constantine
я не подразумеваю случай блокировки, я подразумеваю аномальный случай когда 10 потоков неожиданно в один момент пошли работать с большими объемами данных
Berkus
> в тексте > 3.5 строчки комментов
две строчки из 3.5 поправил! :P
Constantine
или еще более странная проблема что два параллельных потока задействовали гарантированный резервный буфер памяти, потому что у обоих одновременно что-то пошло не так
Berkus
вряд ли эксепшены тебе тут сильно помогут
Constantine
вряд ли эксепшены тебе тут сильно помогут
это не ошибка многопоточного доступа, это исключительная ситуация - резервный аллокатор не может выделить большой последовательный блок, который гарантированно выделится в эксклюзивной среде