在J中定义连接时出现奇怪的长度错误

时间:2011-08-07 02:57:21

标签: j

我正在玩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吗?

我完全难过了。我错过了什么?我已经在连词的定义内部和外部使用了排名。我只是不明白。

1 个答案:

答案 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