如何为APL的Fold运算符(´)分配名称?赋值报错求解
问题
我可以按如下方式定义Sum:
Sum ← +´
该定义能正常运行:
Sum ⟨1, 2, 3⟩ 6
我尝试把Fold运算符单独赋值给一个名称:
Fold ← ´
但触发了错误:
Fold ← ´ Error: Role of the two sides in assignment must match at Fold ← ´ ^^^^
请问有没有可行的方法完成这类定义?
解决办法
在APL里,´是高阶运算符——它需要先接收一个函数作为左操作数才能工作,而直接赋值给普通名称时,名称默认是「函数/变量」角色,和运算符的角色不匹配,所以会报错。要实现你的需求,有两种常用方式:
1. 定义成二元运算符
用APL的运算符定义语法,把Fold做成代理´的二元运算符:
Fold ← {⍺⍺ ´ ⍵⍵}
用法和原生´完全一致:
+ Fold ⟨1,2,3⟩ 6 × Fold ⟨2,3,4⟩ 24
2. 包装成函数
如果习惯先传函数再传数组的调用风格,可以把它包装成普通函数:
Fold ← {⍺ ´ ⍵}
使用示例:
Fold + ⟨1,2,3⟩ 6 Fold × ⟨2,3,4⟩ 24
额外说明
你之前定义的Sum ← +´之所以合法,是因为+´是派生函数——运算符´绑定了左操作数+之后,就变成了一个可以直接作用于数组的函数,它的角色和名称Sum匹配,所以赋值没问题。而单独的´是运算符,不能直接赋值给函数角色的名称。
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

