@ (atop) 的 LHS 似乎适用于整个列表,就像 @: (at) NB 所做的那样。 +/@(*:@:mdev)

LHS of @ (atop) seems to be applied to the whole list as done with @: (at) NB. +/@(*:@:mdev)

在解释中:

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) 中的第一个 @ 应用于整个结果列表而不是 (+/@*:) 中的每个项目?

简短的回答是 u @: v yu 应用于 v y 的整个结果,而 u @ v yu 应用于 [= 的中间结果15=] 基于 v 的排名。

mean 之类的分叉和 mdev 之类的挂钩默认为无限等级,如果您未使用等级连词 (") 另行指定。

这意味着

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

将与

具有相同的排名

*: @: mdev

这又将与 mdev 具有相同的等级,这意味着 @ 将对整个结果起作用,即无限等级。

现在,看看示例 +/ @ *: n,其中 *: 的等级为 0,它适用于原子(您可以在字典条目的顶部找到动词的等级,例如作为 *:)

这意味着 @ 规定 +/ 应用于 n 的每个原子,从而导致您的列表 1 4 9 16

对于 +/ @: *:*: 的排名对 +/ 没有影响,因为 @:+/ 应用于整个结果列表总和。

要获得更深入的参考,Henry Rich 的 J for C 程序员的第 12 章很好地涵盖了这个主题。 http://www.jsoftware.com/help/jforc/compound_verbs.htm#_Toc191734368