foldr vs foldl 作为 APL 中的 reduce 运算符

Ant*_*aev 5 apl

在 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更容易。

Adá*_*dám 5

编程语言来自1962 年

1963年论文中的系统设计编程符号具有相同的定义

1964年论文的共同语言硬件,软件和应用程序 引用自定义编程语言

艾弗森在1966 年论文《评估管理顺序公约》的最后写道

  1. 在定义中

    ? ? 对于非关联函数,从右到左的约定比从左到右的约定更有用。例如,表示 的分量的交替总和,而在从左到右的约定中,它表示第一个分量减去其余分量的总和。因此,如果d为代表数字十进制数字的向量,则表达式的值来确定的整除通过; 在从右到左的约定中,类似的表达式通过确定可整除性。F/x ? x1 F x2 F x3 F ... F x?x

    F-/xxn0=9|+/dn90=11|-/d11