两个APL函数Boxing结果一致但运行结果不同的原因排查
问题原因与解决方法
你的核心问题是混淆了APL的函数组合/列车语法和数组运算语法,导致((0≠-)/-)没有被解析成你期望的复合函数,而是被计算成了一个标量值1。
为什么错误写法返回1?
APL会把((0≠-)/-)解析为数组运算,而非函数组合:
- 单独的
-被视为标量¯1(一元负号的默认作用结果)。 /-是用减法折叠这个标量,结果仍为¯1。0≠¯1的布尔结果为1。
因此,((0≠-)/-)最终是一个常数1,而非复合函数。你的函数{⍺ ((0≠-)/-) ⍵}等价于{⍺ 1 ⍵},而标量1作为二元函数时,会逐元素判断⍺=1 ∧ 1=⍵,若所有元素都满足则返回1,否则返回0,这就是你看到的现象。
正确的优化写法
你可以通过以下两种方式实现无重复计算的优化:
1. 使用复合运算符∘
将差值计算和过滤逻辑复合:
func ← {(0≠⍵)/⍵}∘-
逻辑:先计算⍺-⍵,再将结果传入{(0≠⍵)/⍵}进行过滤。
2. 使用函数列车
用二元列车实现完整逻辑:
func ← (0≠-⊢)/-⊢
-⊢是二元钩子,等价于{⍺-⍵}(⍺ - (⊢⍵))。0≠-⊢是二元钩子,等价于{0≠(⍺-⍵)}。- 整个三元素列车
(0≠-⊢)/-⊢遵循叉积规则:(⍺ (0≠-⊢) ⍵) / (⍺ -⊢ ⍵),完全匹配你需要的逻辑。
内容的提问来源于stack exchange,提问作者kamilok04
相关产品推荐
相关产品推荐

