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 中,由于 ⌿
作为一个普通函数,b
和 txt
的项目将如您所料由 ¨
配对。
在 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 实现)没有说明如何解决这个问题歧义。括号强制 ¨ 将 ⌿ 作为函数。
我想同时压缩⌿
几个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 中,由于 ⌿
作为一个普通函数,b
和 txt
的项目将如您所料由 ¨
配对。
在 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 实现)没有说明如何解决这个问题歧义。括号强制 ¨ 将 ⌿ 作为函数。