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

Alexander Q qalexx на gmail.com
Ср Апр 19 00:56:39 PDT 2017


Чтоб быть точным, монада 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
>>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20170419/fe63f691/attachment-0001.html>


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