И на 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
