APL2,压缩每个

APL2, Compress each

我想同时压缩几个vectors/matrices

这是我的数据:

txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
  b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

现在,我想通过 b 中相应的布尔向量来压缩 txt 中的每个矩阵:

b⌿¨txt

这是我希望得到的回复:

┌───┬───┬───┬───┐
│aaa│bbb│ccc│   │
│   │bbb│ccc│   │
│   │bbb│   │   │
└───┴───┴───┴───┘

我已经在 tryapl.org 试过了,它的行为符合我的预期,但是在 APL2 中我得到一个 DOMAIN ERROR 指向 b 和每个字形。

这里有没有 APL2 黑客可以帮助我解决这个问题? 如果没有显式循环,还有另一种方法吗? Inner/Outer 产品?

这在 APL2 中失败的原因是 在 APL2 中纯粹是一个运算符,而在 Dyalog APL 中它是一个混合体 function/operator,因为如果它有一个数组,它就像一个函数在它的左边,但如果它的左边有一个函数,则作为一个运算符。

在 Dyalog APL 中,由于 作为一个普通函数,btxt 的项目将如您所料由 ¨ 配对。

在 APL2 中,b 将绑定到单子运算符 作为其唯一操作数,然后整个派生函数 b⌿ 将与 ¨ 一起应用txt 的每一项。不用说,整个 b(向量的向量)对于 .

的单个应用来说不是合适的左参数

您可以通过将 包装在一个函数中,然后在该包装函数上使用 ¨ 来解决这个问题。包装器非常简单:

r←x R y
r←x⌿y

在 GNU APL(APL2 的衍生版本)中,您可以在 ⌿ 或 ⌿¨ 周围放置括号:

      txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
        b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

      b(⌿)¨txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb     

      b(⌿¨)txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb        

在最初的 IBM APL2(PC 版)中 none 这些似乎都有效。原因可能是 ⌿ 含糊不清(它可能意味着 "function compress" 以及 "operator reduce")并且 ISO 标准(由 IBM APL2 和 GNU APL 实现)没有说明如何解决这个问题歧义。括号强制 ¨ 将 ⌿ 作为函数。