列表上加法与除法动词组合:J语言表达式结果差异问询
J语言中
% +/ data与frac data结果差异的原因 这个问题的核心在于J语言独特的动词组合规则和表达式求值顺序,咱们一步步拆解来搞清楚:
1. 为什么 % +/ data 得到 0.125?
J语言的表达式遵循右结合的求值逻辑——也就是会优先处理最右侧的操作。这里的+/ data会先被执行:+/是J里的求和动词,对data =: 3 1 4求和得到3+1+4=8。
此时原表达式就简化成了% 8,而%作为一元动词时表示取倒数,所以1 ÷ 8 = 0.125,这就是第一个结果的由来。
2. 为什么 frac data 得到 0.375 0.125 0.5?
当你定义frac =: % +/时,其实是创建了一个复合动词,这里用到了J语言里的**钩子(Hook)**组合规则:当一个二元动词u和一个一元动词v组合成u v时,作用于参数x的结果等价于x u (v x)。
对应到咱们的例子:
u是二元动词%(除法,左侧是被除数,右侧是除数)v是一元动词+/(求和)
所以frac data完全等价于执行:
data % (+/ data)
也就是把data中的每个元素分别除以data的总和:
- 3 ÷ 8 = 0.375
- 1 ÷ 8 = 0.125
- 4 ÷ 8 = 0.5
这就是你看到的第二个结果啦。
如果想验证这个逻辑,直接在J里运行data % (+/ data),结果会和frac data完全一致。
内容的提问来源于stack exchange,提问作者reallymemorable
相关产品推荐
相关产品推荐

