@(atop)的LHS似乎与@:(at)NB一样应用于整个列表.+/@(*:@:MDEV)

tok*_*osh 3 j

在解释中:

n=.1 2 3 4
(+/@*:) n    NB. 1 4 9 16
(+/@:*:) n   NB. 30
Run Code Online (Sandbox Code Playgroud)

在第一个中,sum(+/)应用于square(*:)的每个单个结果,而在第二个中,sum应用于整个结果列表.到现在为止还挺好.但是下一个例子似乎没有那样工作(可能它确实如此.我只是不明白):

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
Run Code Online (Sandbox Code Playgroud)

ssq括号中表达式很好.它按预期工作:(*:@:mdev) n产生一个正方形列表.这与哪个@@:使用无关.我理解其中的区别.但是@括号外面应该是我理解sum(+/)每个项目的结果(*:@:mdev).

谁可以启发我的理解是错的?为什么是第一个@+/@(*:@:mdev)应用到整个结果列表,而不是每个项目中(+/@*:)

bob*_*bob 6

简短的答案是u @: v y适用u于整个结果,v yu @ v y适用uv基于等级的中间结果v.

如果没有使用Rank连接()指定,则默认为无限等级的叉子mean和钩子等.mdev"

这意味着

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

将具有相同的排名

*: @: mdev

反过来将具有相同的等级,mdev这意味着@将对整个结果即无限等级起作用.

现在,看一下排名为0 的示例+/ @ *: n,*:它适用于原子(您可以在基元的词典条目顶部​​找到动词的排名,例如*:)

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

因为+/ @: *:等级因为并且 被应用于作为列表之和的整个结果而*:没有影响.+/@:+/

有关更深入的参考,Henry Rich的J for C程序员的第12章非常清楚地介绍了这个主题. http://www.jsoftware.com/help/jforc/compound_verbs.htm#_Toc191734368