LHS @ (поверх), кажется, применяется ко всему списку, как это делается с @: (at) NB.+ / @ (*: @: Mdev) - PullRequest
0 голосов
/ 05 октября 2018

В объяснении:

n=.1 2 3 4
(+/@*:) n    NB. 1 4 9 16
(+/@:*:) n   NB. 30

В первом из них сумма (+/) применяется к каждому отдельному результату квадрата (*:), тогда как во втором применяется суммана весь список результатов.Все идет нормально.Но следующий пример, похоже, не работает таким образом (вероятно, работает. Я просто не понимаю):

mean=.+/%#
mdev=.-mean
(*:@:mdev) n          NB. 2.25 0.25 0.25 2.25

ssq=.+/@(*:@:mdev)
ssq n                 NB. 5
+/@(*:@:mdev)         NB. 5 - why not: 2.25 0.25 0.25 2.25
+/@:(*:@:mdev)        NB. 5

В ssq выражение в скобках в порядке.Это работает как ожидалось: (*:@:mdev) n приводит к списку квадратов.Здесь не имеет значения, какой @ или @: используется.Я понимаю разницу.Но @ вне скобки должно, насколько я понимаю, суммировать (+/) каждый элемент результата (*:@:mdev).

Кто может просветить меня, если мое понимание неверно?Почему первый @ в +/@(*:@:mdev) применяется ко всему списку результатов, а не к каждому элементу, как в (+/@*:)?

1 Ответ

0 голосов
/ 06 октября 2018

Короткий ответ: u @: v y применяет u ко всему результату v y, тогда как u @ v y применяет u к промежуточным результатам v на основе ранга v.

Вилы, такие как mean, и крючки, такие как mdev, по умолчанию равны бесконечному рангу, если вы не укажете иное с помощью соединения Rank (").

Это означает, что

+/ в +/ @ (*: @: mdev) и +/ @: (*: @: mdev)

будут иметь тот же ранг, что и

*: @: mdev

, который в свою очередь будет иметь тот же ранг, что и mdev, что означает, что @ будет работать на весь результат, то есть на бесконечный ранг.

Теперь рассмотрим пример +/ @ *: n, где *: имеет ранг 0 и работает с атомами (вы можете найти ряды глаголов в верхней части словарных статей для таких примитивов, как *:)

Это означает, что @ означает, что +/ применяется к каждому атому n, что приводит к вашему списку 1 4 9 16.

Для +/ @: *: ранг *: не влияет на +/, поскольку @: и +/ применяется ко всему результату, который является суммой списка.

Для более подробного ознакомления глава 12 J-программистов Генри Рича очень хорошо освещает эту тему.http://www.jsoftware.com/help/jforc/compound_verbs.htm#_Toc191734368

...