<div>думаю это похоже на операторы с условием NULL в C#<br />https://msdn.microsoft.com/ru-ru/library/dn986595.aspx</div><div><br /></div><div><br /></div><div>19.04.2017, 09:03, "Alexander Q via Moscow-pm" <moscow-pm@pm.org>:</div><blockquote type="cite"><div dir="ltr">Чтоб быть точным, монада Maybe в терминах хаскеля.<div><br /></div><div>из пары функций типов f :: a -> Maybe b, g :: b -> Maybe c вы составляете функцию a -> Maybe c оператором bind ("мягкого вызова" в ваших терминах) следующим образом:</div><div><br /></div><div>(f a) >>= g</div><div><br /></div><div>или можете сделать функцию новую просто с новым типом</div><div>u :: a -> Maybe c</div><div>u = f >> g</div><div><br /></div><div>и применять её</div><div>u a</div><div><br /></div><div>Вообще, монады не просто так возникли. Это хорошая, мощная абстракция, которая работает не только для "мягких вызовов". Нет ничего плохого в придумывании велосипедов, но прежде чем запускать их массовое производство, имеет смысл изучить опыт конкурентов.<br /><br /><br /></div></div><br /><div><div dir="ltr">On Wed, Apr 19, 2017 at 10:42 AM Alexander Q <<a href="mailto:qalexx@gmail.com">qalexx@gmail.com</a>> wrote:<br /></div><blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex;"><p dir="ltr">Это монада</p>
<br /><div><div dir="ltr">On Wed, 19 Apr 2017, 10:21 KES via Moscow-pm, <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>> wrote:<br /></div><blockquote style="margin:0 0 0 0.8ex;border-left:1px #ccc solid;padding-left:1ex;">Привет.<br />
<br />
А у меня вот давно витает идея "мягкого вызова".<br />
Даже ещё когда писал на ассемблере всегда раздражали исключения при `CALL 0`<br />
<br />
ну вот снова вернулся к этой теме.<br />
<br />
1. Что не так?<br />
Очень часто приходится писать следующий код:<br />
my $x; my $y;<br />
if( ($x =  $obj->method)   &&  $y =  $x->another_method ) {<br />
     $y = ...;<br />
}<br />
<br />
Пример из жизни:<br />
<br />
if( $db->query( ... )->hash->{ value } ) { ... }<br />
if( $db->resultset( 'table' )->search( ... )->related_resultset( 'table2' ) { ... }<br />
<br />
<br />
тут если запрос вернул пустой результат, то код упадёт.<br />
<br />
А если использовать оператор мягкого вызова, то можно будет не бояться исключений и код станет проще:<br />
<br />
use pragma 'soft_call';<br />
if( my $x =  $obj->method~>another_method ) { ... }<br />
if( $db->query( ... )~>hash->{ value } ) { ... }<br />
if( $db->resultset( 'table' )->search( ... )~>related_resultset( 'table2' ) { ... }<br />
<br />
И вроде как всё выразительно получается.<br />
<br />
Даже сама реализация прагмы в десяток строк:<br />
1. делаем плагин для keyword, Наподобие  Syntax::Keyword::Try<br />
2. цепляемся на <a href="http://perldoc.perl.org/perlguts.html#Pluggable-runops" rel="noreferrer" target="_blank">http://perldoc.perl.org/perlguts.html#Pluggable-runops</a><br />
3. Псевдокод:<br />
sub soft_call_operator {<br />
    my( $left_operand, $right_operand ) =  @_;<br />
<br />
    return undef    if !defined $left_operand;<br />
<br />
    '->'( $left_operand, $right_operand ); # делаем обычную обработку вызова функции<br />
}<br />
<br />
<br />
Комментарии wellcome<br />
--<br />
Moscow.pm mailing list<br />
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br />
</blockquote></div></blockquote></div>
,<span>-- <br />Moscow.pm mailing list<br /><a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/">http://moscow.pm.org</a><br /></span></blockquote><div><br /></div><div><br /></div><div>-- <br />Яндекс.Почта — надёжная почта</div><div>http://mail.yandex.ru/neo2/collect/?exp=1&t=1</div><div><br /></div>