gpt4 book ai didi

apl - 在 Dyalog 中创建闭包向量

转载 作者:行者123 更新时间:2023-12-03 05:03:56 24 4
gpt4 key购买 nike

我想定义一个带有单个参数的匿名函数向量,然后映射一个参数 x穿过这个向量,返回 f(x) 的结果数组对于每个索引。这在 Dyalog 中可能吗?

我问是因为我天真地尝试创建这样一个闭包向量:

fs ← {⍵×2} {⍵×4} {⍵×8}

行为怪异。试图引用 fs 的单个索引似乎引用了所有这些并且输出乱码:
 fs[1]
∇{⍵×2}
∇ ∇{⍵×4}
∇ ∇{⍵×8}
∇ [ 1
⍴fs返回类似的输出而不是 3,这让我相信我根本没有创建数组。解决这个问题的正确方法是什么?

最佳答案

不幸的是,这在 Dyalog 中是不可能的。你在那里做的确实不是一个数组,一个fgh-fork ,这是一串函数 f g h那,当像 (f g h)Y 这样被单调地调用时, 表现得像 (f Y)g h Y .如果左括号 ( [ ) 的正左侧有一个函数而不是数组,那么这不是括号索引,而是 axis operator .但是,轴操作符只能应用于一些原始函数,以及派生自 / 的函数。 , \ , ,因此如果将其应用于您的函数,则会出现语法错误。
⍴fs同样是一个函数序列,在这种情况下是一个顶部,而不是会返回 fs 形状的东西。 , 如 fs是一个函数。

但是,即使函数不是 APL 中的一流对象,您也可以通过某种方式滥用训练,使其看起来好像参数实际上是跨函数数组映射的。让我们定义一个“Function ChainLink”函数FL以此目的:

FL ← {(⊂⍺),⍵}

所以,假设我们有函数 f , g , h和一个论点 Y我们要返回 (f Y)(g Y)(h Y) .现在可以写成 (f FL g FL h)Y , 对?嗯,不,有一个问题。最右边出现的 FL必须替换为 FL∘⊂ .不幸的是,这是一个不可避免的麻烦,但至少现在你可以不用提 Y每次。现在有两种情况:
  • 函数数组(链)的长度为 1,即它只包含一个函数 f : 在这种情况下,您可以简单地使用 (⊂f)Y .
  • 函数链包含多个函数,假设f , gh : 现在,你会写 (f FL g FL∘⊂h)Y .

  • 我建议保持此函数的名称简短,最多 2 个字符,因为它将被多次使用。

    以及,如何 FL功能工作?事实上,它将结果链接在一起,而不是函数本身。它只是 enclose将结果放在数组的左边( (⊂⍺) ),然后 con catenate s 其右侧的结果 ( ,⍵ )。这导致将左侧结果“预先”添加到右侧的结果数组中,但将其保持在一起,即不分离其各个元素。原因 第一次在这样的“链”中使用它是因为 FL无法确定其右边的数组是正确函数的结果还是结果数组,因此,通过封闭第一次,您可以确保 FL的正确参数始终是一个结果数组,而不是一个会因添加元素而破坏的裸结果。

    值得注意的是,您也可以二元调用这样的链,在这种情况下,它的所有函数(不是 FL )都将使用相同的两个参数二元调用。例如, X(f FL g FL∘⊂h)Y(X f Y)(X g Y)(X h Y) 相同.但是,您可能希望以单一方式调用某些函数。虽然与手头的问题没有直接关系,但这个 monadic 运算符将使函数忽略它们的左参数(如果有的话),并且对于这个目的非常有帮助,仅仅是因为你避免了括号:
    M ← {⍺⍺ ⍵}

    所以,假设我们有四个函数 f , g , hp ,我们要调用 gp单一的,同时保留 f 的左参数和 h .现在我们已经实现了 M , 我们可以用 X 做到这一点是左参数和 Y是对的:
    X(f FL g M FL h FL∘⊂p M)Y

    同样,我建议,如果您决定实现这个 monadic 操作符,您应该将其名称保持为 1 个字符长。

    关于apl - 在 Dyalog 中创建闭包向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49953897/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com