Короткий ответ: 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