Perl6 hyper »оператор не работает как карта

Насколько я понимаю, гипероператор » является сокращением для map(). Почему следующее возвращает два разных результата, а во втором примере .sum, похоже, не применяется?

say ([1,2], [2, 2], [3, 3]).map({.sum});
# (3 4 6)
say ([1,2], [2, 2], [3, 3])».sum;
# ([1 2] [2 2] [3 3])

person pistacchio    schedule 03.08.2016    source источник


Ответы (2)


Гиперопсии рекурсивно спускаются в подсписки. Кроме того, они являются кандидатами на использование автозапуска (NYI), что означает, что их операции не работают.

Также была ошибка, исправленная с помощью https://github.com/rakudo/rakudo/commit/c8c27e93d618bdea7de3784575d867d9e7a2f6cb.

say ([1,2], [2, 2], [3, 3])».sum;
# (3 4 6)
person Community    schedule 03.08.2016
comment
все это правда, но обратите внимание, что гипероператоры не обязательно спускаются в подструктуры (см. say ([1,2], [2, 2], [3, 3])».elems); возможно, List.sum просто не хватает is nodal аннотации ... - person Christoph; 03.08.2016

TL; DR Вы почти наверняка столкнулись с ошибкой. Тем не менее, map и » гипервернуты имеют большие различия.

map возвращает Seq. Это Seq дает результаты применения предоставленного пользователем кода к каждому из элементов предоставленной пользователем структуры данных:

  • на один уровень в глубину (обход структуры данных неглубокий - map не спускается рекурсивно к подструктурам верхнего уровня структуры данных)
  • по одному (все делается последовательно, параллельно ничего)
  • лениво (map возвращается немедленно; предоставленный пользователем код применяется к предоставленной пользователем структуре данных для генерации результатов позже, когда это необходимо для извлечения значений из Seq)

Гипероп » возвращает операнд структуры данных слева после первого применения унарной операции справа к элементам этой структуры данных:

  • только на один уровень или по убыванию до листьев в соответствии с унарной операцией
  • в параллельных пакетах, по крайней мере, семантически (программист обязан выбрать унарную операцию, которая даст правильные результаты при применении к нескольким элементам параллельно в произвольном порядке)
  • с нетерпением (в отличие от вызова map, гипероперация возвращается только тогда, когда унарный оператор был применен ко всей структуре данных)

Если вы применяете унарный оператор, который является "узловым" (поэтому гипероперация выберет не для спуска) или структура данных, с которой работает, только на один уровень (поэтому нет выходов нижнего уровня для гипероперации, на которую можно спуститься), тогда различия между гипероперацией и map с унарным оператором просто последовательный / параллельный и ленивый / нетерпеливый аспекты.

Мне кажется довольно очевидным, что sum должен быть узловым оператором, иначе он будет спускаться в подструктуры, пока не достигнет отдельных листьев, и, таким образом, в конечном итоге будет применяться к группе отдельных значений, что бессмысленно. ETA: Похоже, теперь это исправлено.

person raiph    schedule 06.08.2016