在解释中:
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)应用到整个结果列表,而不是每个项目中(+/@*:)?
简短的答案是u @: v y适用u于整个结果,v y而u @ v y适用u于v基于等级的中间结果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
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |