Крылатый
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 нотация это жеж императивный сахар.
Крылатый
А нам сюда скорей нужен... chain
Berkus
Крылатый
Мол fuck(tits) >> wash >> show
Крылатый
доня.
ну это всё через монадки работает
ща, вот допустим есть монада 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 "распаковывает" значение из монадки
доня.
(надеюсь меня не забанят за монадки в цепепе-чате 😄)
Berkus
Крылатый
ML/C++
Крылатый
Неплохой вышел бы гибрид.
Berkus
хых, template ml
Крылатый
Дыа.
доня.
🐙 Antony
ну это всё через монадки работает
ща, вот допустим есть монада 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);
}
Я с Вицентом говорил, в идеале монады будут выглядеть так:
expected<double, error_condition> foo(double i, double j, double k) {
auto x = try safe_divide(i, k); // return в случае ошибки
auto y = try safe_divide(j, k); // return в случае ошибки
return x + y;
}
доня.
ну что-то похожее на do-нотацию по сути
Vladislav
🐙 Antony
поведение try должно настраиваться какими-то трейтами, которые может пользователь специализировать
🐙 Antony
тоессть может и для future, и для optional, и для expected работать
🐙 Antony
Но предложение сильно сырое, кажется что даже класс expected на ближаёшем собрании не одобрят
Constantine
А можно краткий курс как это должно работать (для чайников)?
Vladislav
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
Господин Полухин показывал возможный пропозал для уточнения эксепшенов, используй его.
Constantine
Berkus
https://stackoverflow.com/questions/44858395/why-is-the-template-specialization-not-chosen хех
Berkus
Constantine
как и твоя, так что остынь
я просто не понимаю, зачем нужна реплика в духе "загугли не знаю что", если человек изначально запрашивает обзорные сведения
Berkus
bad_alloc достаточно показательная ошибка, так что непонятно чего ты хотел вообще
Крылатый
Продолжаем день монад! http://www.fluentcpp.com/2017/07/11/dealing-multiple-paths-vector-monad-c/
Stanislav
Stanislav
https://github.com/LoopPerfect/neither
Berkus
Berkus
Constantine
Berkus
Berkus
ты себя не зря в std::trolls:: засунул, прямо сочится из монитора
Constantine
добавь << backtrace();
а теперь если я захочу программно обрабатывать случай когда bad_alloc происходит в объекте, который может освободиться пулом параллельного потока и тогда retry?
Крылатый
Крылатый
> в тексте
> 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
Constantine
или еще более странная проблема что два параллельных потока задействовали гарантированный резервный буфер памяти, потому что у обоих одновременно что-то пошло не так
Berkus
вряд ли эксепшены тебе тут сильно помогут
Крылатый
Constantine
вряд ли эксепшены тебе тут сильно помогут
это не ошибка многопоточного доступа, это исключительная ситуация - резервный аллокатор не может выделить большой последовательный блок, который гарантированно выделится в эксклюзивной среде