在 Kenneth Iverson 的A Programming Language 中,归约操作op/定义为foldl(左折叠):
The ?-reduction of a vector is denoted by ?/ and defined as
z??/ ? z = (?((? ? ?) ? ?) ? ? ?)
Run Code Online (Sandbox Code Playgroud)
然而在现代 APL 中,它显然是一个正确的折叠 ( foldr )
{??}/'abcd'
????????????
?a ?????????
? ?b ??????
? ? ?cd???
? ? ??????
? ?????????
????????????
Run Code Online (Sandbox Code Playgroud)
我想知道这种变化是什么时候发生的(动机是什么)?
也许(?)?/v仅定义为v? ? v? ? ? ? v?,其中(给定 APL 规则)将解析为foldr确实有意义。另一方面,实现高效的foldl更容易。
编程语言来自1962 年。
在1963年论文中的系统设计编程符号具有相同的定义。
在1964年论文的共同语言硬件,软件和应用程序 引用自定义编程语言。
艾弗森在1966 年论文《评估管理顺序公约》的最后写道:
在定义中
? ? 对于非关联函数,从右到左的约定比从左到右的约定更有用。例如,表示 的分量的交替总和,而在从左到右的约定中,它表示第一个分量减去其余分量的总和。因此,如果d为代表数字十进制数字的向量,则表达式的值来确定的整除通过; 在从右到左的约定中,类似的表达式通过确定可整除性。
F/x ? x1 F x2 F x3 F ... F x?xF-/xxn0=9|+/dn90=11|-/d11