在Dyalog中创建闭包向量并映射参数是否可行?
在Dyalog APL中创建匿名函数向量并映射参数的正确方法
当然可行!你踩的坑是Dyalog APL里函数数组的构造方式和你想的不一样——直接用空格堆匿名函数根本不是创建向量,反而会被解释成奇怪的函数调用组合,自然行为异常。
正确构造函数向量
要创建包含匿名函数的向量,你需要用⊂(封装操作符)把每个函数单独包裹,再组合成数组。这样每个函数会成为数组的独立元素:
// 方法1:用逗号拼接封装后的函数 fs ← ⊂{⍵×2} , ⊂{⍵×4} , ⊂{⍵×8} // 方法2:用数组构造语法直接创建 fs ← (⊂{⍵×2}) (⊂{⍵×4}) (⊂{⍵×8})
现在你可以正常访问单个函数了:
fs[1] // 返回 {⍵×2} fs[1] 3 // 输出 6
映射参数到函数向量
要把参数x应用到向量里的每个函数,得到结果数组,用¨(每个)操作符就可以轻松实现:
x ← 5 results ← x ¨ fs // 或者写成 fs ¨ x,效果完全一致
执行后results会是10 20 40,正好是每个函数对5的计算结果。
为什么原写法会出问题
你最初写的fs ← {⍵×2} {⍵×4} {⍵×8},APL会尝试把第二个函数{⍵×4}作为参数传给第一个函数{⍵×2}——但第一个函数期望的是数值参数,不是函数,这就导致fs变成了一个异常的对象(本质是错误的函数应用组合),所以访问索引或者使用它时才会出现混乱的输出。
内容的提问来源于stack exchange,提问作者Ian Martin
相关产品推荐
相关产品推荐

