См. https://metacpan.org/pod/Promises и https://metacpan.org/pod/Future
On Apr 19, 2017 11:19, "Alexander Q via Moscow-pm" <[email protected]> wrote: > И на safe calls nullable типов в Kotlin https://kotlinlang.org/docs/ > reference/null-safety.html#safe-calls > > Только монады — это гораздо больше и значительно раньше. > > On Wed, Apr 19, 2017 at 11:08 AM Коваль Вячеслав <[email protected]> > wrote: > >> думаю это похоже на операторы с условием NULL в C# >> https://msdn.microsoft.com/ru-ru/library/dn986595.aspx >> >> >> 19.04.2017, 09:03, "Alexander Q via Moscow-pm" <[email protected]>: >> >> Чтоб быть точным, монада Maybe в терминах хаскеля. >> >> из пары функций типов f :: a -> Maybe b, g :: b -> Maybe c вы составляете >> функцию a -> Maybe c оператором bind ("мягкого вызова" в ваших терминах) >> следующим образом: >> >> (f a) >>= g >> >> или можете сделать функцию новую просто с новым типом >> u :: a -> Maybe c >> u = f >> g >> >> и применять её >> u a >> >> Вообще, монады не просто так возникли. Это хорошая, мощная абстракция, >> которая работает не только для "мягких вызовов". Нет ничего плохого в >> придумывании велосипедов, но прежде чем запускать их массовое производство, >> имеет смысл изучить опыт конкурентов. >> >> >> >> On Wed, Apr 19, 2017 at 10:42 AM Alexander Q <[email protected]> wrote: >> >> Это монада >> >> On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <[email protected]> wrote: >> >> Привет. >> >> А у меня вот давно витает идея "мягкого вызова". >> Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL >> 0` >> >> ну вот снова вернулся к этой теме. >> >> 1. Что не так? >> Очень часто приходится писать следующий код: >> my $x; my $y; >> if( ($x = $obj->method) && $y = $x->another_method ) { >> $y = ...; >> } >> >> Пример из жизни: >> >> if( $db->query( ... )->hash->{ value } ) { ... } >> if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' >> ) { ... } >> >> >> тут если запрос вернул пустой результат, то код упадёт. >> >> А если использовать оператор мягкого вызова, то можно будет не бояться >> исключений и код станет проще: >> >> use pragma 'soft_call'; >> if( my $x = $obj->method~>another_method ) { ... } >> if( $db->query( ... )~>hash->{ value } ) { ... } >> if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' >> ) { ... } >> >> И вроде как всё выразительно получается. >> >> Даже сама реализация прагмы в десяток строк: >> 1. делаем плагин для keyword, Наподобие Syntax::Keyword::Try >> 2. цепляемся на http://perldoc.perl.org/perlguts.html#Pluggable-runops >> 3. Псевдокод: >> sub soft_call_operator { >> my( $left_operand, $right_operand ) = @_; >> >> return undef if !defined $left_operand; >> >> '->'( $left_operand, $right_operand ); # делаем обычную обработку >> вызова функции >> } >> >> >> Комментарии wellcome >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org >> >> ,-- >> >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org >> >> >> >> -- >> Яндекс.Почта — надёжная почта >> http://mail.yandex.ru/neo2/collect/?exp=1&t=1 >> >> > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > >
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
