在解释中:
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 次 |
最近记录: |