APL 中的函数向量
Posted
技术标签:
【中文标题】APL 中的函数向量【英文标题】:Vector of functions in APL 【发布时间】:2022-01-05 22:06:16 【问题描述】:APL 中函数向量(数组)的语法是什么?
我尝试了以下方法,但它们分别被解释为 3-train 和 2-train:
1,2
1 2
PS。顺便说一下,我希望使用更复杂(并且可能命名)的函数来做到这一点,上面的 1
就是这样 示例很短。
【问题讨论】:
APL 并不像您想象的那样功能。函数不能直接作为向量中的条目。 【参考方案1】:可以使用⎕OR
(Object Representation) 获得函数数组,并且这些对象在用作操作数时会隐式重组为函数。 (您也可以使用⎕FX
显式执行此操作。)首先定义一些辅助运算符是最简单的:
_Arrayify←f←⍺⍺ ⋄ ⎕OR'f'
_Apply←2=⎕NC'⍺':⍺ ⍺⍺ ⍵ ⋄ ⍺⍺ ⍵
现在,让我们定义一些示例函数:
A←2×⍵
B←⍵÷2
C←-⍵
我们创建一个 3 元素的函数向量,并检查它确实是一个“正常”数组:
fnArray←(A _Arrayify⍬)(B _Arrayify⍬)(C _Arrayify⍬)
⍴fnArray
3
让我们提取第二个函数并应用它:
(2⊃fnArray)_Apply 10
5
我们也可以创建一个应用函数,所以我们可以在上面使用操作符:
Apply←⍺ _Apply ⍵
fnArray Apply¨10
20 5 ¯10
【讨论】:
【参考方案2】:Dyalog APL 不正式支持函数数组,您可以通过创建具有相同名称函数的命名空间数组来笨拙地模拟它们。
(a←⎕NS⍬).f←2∘×
(b←⎕NS⍬).f←÷∘2
(c←⎕NS⍬).f←-
f←(a b c).f
f 4
8 2 ¯4
Maria Wells suggested an operator to produce an array of functions
【讨论】:
问题是不能索引到函数数组中来选择应用哪一个,所以真的和f←(⊂2∘×),(⊂÷∘2),(⊂-)
没有什么区别@
但是如果你将函数留在命名空间中,你就有了一个数组(尽管是命名空间而不是实际的函数),你可以像其他数组一样对它进行索引和操作。这是在对象数组上调用方法时理所当然发生的事情,这是 Dyalog 的一个非常强大的特性。
在命名空间中封装函数并获取对象表示都是实现函数数组的方法,我不清楚后者比前者更优雅或更强大。
一个比另一个更便携(⎕or
和 ⎕nc
vs ⎕ns
)?我在某处读到命名空间是 ISO 标准 APL,但在实际标准中找不到它们的提及。以上是关于APL 中的函数向量的主要内容,如果未能解决你的问题,请参考以下文章