我正在玩J中的副词和连词,并遇到了一个奇怪的问题。我已经定义了一个名为persistence
的简单副词,可用于查看计算数字产品或数字的数字总和时生成的数字的进展。
S =: 1 : 'u/@:("."0)@":^:a:"0'
+ S 234
给了我们234 9
。然后我用它来创建另一个计算数字持久性的副词。
P =: 1 : '<:@#@(u S)"0'
+ P 234
给了我们1
。现在,假设我们想要找到30以下的附加持久性为2的所有数字,然后查看S
为每个数字生成的列表,例如,
+ S I. 2 = + P i.30
这将生成以下列表:
19 10 1
28 10 1
29 11 2
到目前为止,这么好。现在,我想把它变成一个连词,它的左侧包含用于持久性的动词,其右侧包含用于限制列表的数字。 (上例中的2
。)这是我对该连词的定义:
Q =: 2 : 'u S I. n = u P'
如果我将表达式+ Q 2
输入J控制台,我会回复以下内容:
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0
这是完全正确的,如果我使用i.30
之类的参数运行完整表达式,它可以正常工作:
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30
但是,当我将表达式+ Q 2 i.30
输入J控制台时,我收到了“长度错误”。为什么?! + Q 2
不完全等同于+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0
吗?
我完全难过了。我错过了什么?我已经在连词的定义内部和外部使用了排名。我只是不明白。
答案 0 :(得分:3)
+ Q 2
与您提供的表达式完全等效,但在表达式中使用它时,就好像它在括号中一样。
+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0 i.30
19 10 1
28 10 1
29 11 2
(+/@:("."0)@":^:a:"0 I. 2 = <:@#@(+/@:("."0)@":^:a:"0)"0) i.30
|length error
一般情况f g h y
!= (f g h) y
。后者f g h
定义了train。例如:
avg=: +/ % #
+/ % # 1 2 3
0.333333
(+/ % #) 1 2 3
2
avg 1 2 3
2
您可以通过添加对y的引用来修复您的连接:
Q=: 2 : 'u S I. n = u P y'
+ Q 2 i.30
19 10 1
28 10 1
29 11 2