一旦在默认情况下添加平方根,结果就会不同

different result once square root is added inside tacit

对 J 很陌生。我喜欢它,但还远远不够熟练。 我设法遇到了一个问题,但我不知道为什么会这样。如果有人可以解释为什么会这样,我可以了解更多关于这种直截了当的语言。

基本上我是先求差 (-) 然后求平方 (*:) 然后求和 (+/) 然后求平方根 (%:)。 现在平方和误差部分 ((+/@:*:@:-) ) 工作正常:

   1 2 3 4 5 (+/@:*:@:-) 2 2 2 2 2
15

然后我可以这样得到平方根(只需在左边加上 %:):

   %: 1 2 3 4 5 (+/@:*:@:-) 2 2 2 2 2
3.87298

但是当我在中间的 atco(默认?)部分的左侧添加平方根时,它没有给我正确的结果:

   1 2 3 4 5 (%:@:+/@:*:@:-) 2 2 2 2 2
1.57001

它而不是 returns 1.57001 而不是 3.87298。

我的理解是我所做的只是添加一个 'then do square root' 但显然我错了。但是我不明白为什么。

当我解剖的时候:

require 'debug/dissect'
dissect '1 2 3 4 5 (%:@:+/@:*:@:-) 2 2 2 2 2'

我看到 diff (-) 和 square (*:) 在它们自己的解剖框中。但是最后一个框将总和 (+/) 和平方根 (%:) 组合在一起,显示 %:@:+/ 。不是 +/ 然后 % 的单独框:.

正如我所说,我是 J 的新手,正在努力理解为什么会出现这种情况。

我尝试改为使用 &、&: 和 @,但正如预期的那样并没有解决这个问题。 它似乎也不是由于某些成分限制,因为它工作正常(有更多的 atco 组合):

   (>:@:>:@:>:@:>:@:>:@:>:@:>:@:>:@:>:) 2 2 2
11 11 11

谢谢

您正在尝试为以下表达式构成二元动词:

%: +/ *: x - y  NB. which we can write as

f g h x - y     NB. if we define:

f =: %:
g =: +/
h =: *:

f g h x - y
3.87298

使它成为二元动词的一种方法是在任何地方应用 @:

x (f@:g@:h@:-) y
3.87298

x (%: @: (+/) @: *: @: -) y
3.87298

一种更惯用的方法是使用 under (&.) 在应用另一个动词后反转动词:

f &.: g  y             NB. expands to
(g-inverse) f g y

g &.: h (x - y)
3.87298

x ( g &.: h @: -) y 
3.87298

NB. or if you prefer monadic verbs:
(g &.: h @: -/) x,: y

您遇到的问题是

(%:@:+/@:*:@:-)

被评估为

   1 2 3 4 5 ((%:@:+)/@:*:@:-) 2 2 2 2 2
1.57001

而不是

   1 2 3 4 5 %:@:(+/@:*:@:-) 2 2 2 2 2
3.87298

因为连词尽可能多地占用左操作数的方式。这意味着当您希望 %: 应用于 +/@:*:@:-

的结果时,*:@:- 正在处理您的部分结果

由于您刚刚开始使用 J,这可能有点高级,但在某些时候您可能想要阅读 Henry Rich 为 C 程序员编写的 J 的默认编程部分。关于J句是如何解析的,里面有很好的解释。当您想更改执行顺序时,括号是您的朋友。 https://www.jsoftware.com/help/jforc/contents.htm#_Toc191734581

编辑:正如@Eelvex 在下面的评论中指出的那样,中断实际上发生在 (+/),但结果是相同的,因为从左到右评估连词的方式。