[Moscow.pm] Soft call operator (Оператор мягкого вызова): ~>

Andrey Kovbovich akovbovich на gmail.com
Ср Апр 19 13:33:12 PDT 2017


См. https://metacpan.org/pod/Promises и https://metacpan.org/pod/Future

On Apr 19, 2017 11:19, "Alexander Q via Moscow-pm" <moscow-pm на pm.org> wrote:

> И на safe calls nullable типов в Kotlin https://kotlinlang.org/docs/
> reference/null-safety.html#safe-calls
>
> Только монады — это гораздо больше и значительно раньше.
>
> On Wed, Apr 19, 2017 at 11:08 AM Коваль Вячеслав <theathlet на yandex.ru>
> wrote:
>
>> думаю это похоже на операторы с условием NULL в C#
>> https://msdn.microsoft.com/ru-ru/library/dn986595.aspx
>>
>>
>> 19.04.2017, 09:03, "Alexander Q via Moscow-pm" <moscow-pm на pm.org>:
>>
>> Чтоб быть точным, монада 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 <qalexx на gmail.com> wrote:
>>
>> Это монада
>>
>> On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <moscow-pm на pm.org> 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
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>> ,--
>>
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>>
>> --
>> Яндекс.Почта — надёжная почта
>> http://mail.yandex.ru/neo2/collect/?exp=1&t=1
>>
>>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/5d6714b6/attachment.html>


Подробная информация о списке рассылки Moscow-pm