APL中递归dop(双∇)的用法示例及属性确认问询
递归DOP(用户自定义操作符)示例与问题解答
1. 典型递归DOP示例代码
tryapl.org中用双Del(∇∇)实现的递归DOP,以“重复应用指定函数N次”的操作符为例:
∇ r←f repeat n :If n=0 r←⊢ ⍝ 返回恒等函数,应用后不改变输入值 :Else r←f ⍺⍺ repeat n-1 ⍝ 递归:将函数f与repeat操作符作用于n-1次,生成新的复合函数 :EndIf ∇∇
2. 具体使用示例
这个repeat是二元操作符:左操作数为要重复的函数,右操作数为重复次数。使用时需先将操作符与函数、次数绑定,再作用于目标数组:
示例1:单目函数重复应用
将+3(给输入加3的单目函数)重复应用2次到数值5:
5 (+3) repeat 2
执行逻辑:repeat 2生成的复合函数是连续执行两次+3,最终结果为5+3+3=11。
示例2:二元函数适配使用
对于二元函数(比如+),可通过∘绑定固定右参数,生成单目函数后使用:
5 (+∘3) repeat 2
结果同样为11;也可直接让生成的复合函数以二元方式调用:
(+ repeat 2) 5 3
逻辑为(5+3)+3=11,输出结果11。
3. 是否属于单目DOP的解答
操作符的“单目/二元”取决于它接受的操作数数量,而非是否使用⍺(函数应用时的左参数):
- 你提到的DOP使用了
⍺⍺(操作符的左操作数,即传入的函数),说明它是二元操作符——需要同时接收左操作数(函数)和右操作数(如示例中的重复次数)。 - 代码中未用到
⍺,是因为这个DOP的作用是生成复合函数,⍺是最终复合函数应用时的左参数,并非操作符本身的操作数。 - 单目DOP只会接受一个操作数(通常是函数),定义格式为
∇ r←op f,不会同时存在⍺⍺和⍵⍵。
4. 调用报错的常见原因
你调用时出错,大概率是操作方式不符合规则:
- 错误方式1:跳过函数指定,直接用操作符作用于数组,比如
5 repeat 2 - 错误方式2:颠倒操作数顺序,比如
repeat (+3) 2 - 错误方式3:混淆操作符绑定与函数应用的顺序,比如
repeat 2 (+3) 5
内容的提问来源于stack exchange,提问作者ThePoetCoder
相关产品推荐
相关产品推荐

