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

Alexander Q qalexx на gmail.com
Ср Апр 19 01:11:24 PDT 2017


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


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