我如何在 J 中绑定参数的一侧时任意组合二元函数?

How do I arbitrarily compose dyadic functions while bonding one side of their arguments in J?

我有一个二元函数,称之为 f,它使用一个数字和一个数组并输出另一个数组。例如:

   0 f x_0
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

其中 x_0 =: 1+i.30.

我想运行这个任意次数,但是将计算的数组结果提供给f的下一次调用。例如,对于 3(输出数组似乎是任意的,但它是正确的):

   3 f 2 f 1 f 0 f x_0
2 8 6 9 4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

我想要一个 x g y 形式的函数,其中 x 是一个数字,y 是起始数组,它将应用 g x 使用 y 作为初始输入的次数。

我试图为此使用后缀 \.,但我无法弄清楚如何将 x_0 作为初始列表传递给 f。我不只是需要做 2 f 1 f 0 f。似乎我需要一个接受数字的函数,然后将许多函数链接在一起,同时 & 将整数参数传递给 f。但是,这失败了。例如:

   f2 =: 3 & f 2 & f 1 & f 0 & f
   f2 x_0
|index error: g1
|       f2 x_0

这似乎很接近,但我想我对 & 的工作原理有一些误解(g1 是一个内部函数,如有必要我可以分享)。我想我想要类似的东西:f(2, f(1, f(0, y)))y 是我的初始列表,但我不想显式调用 f.

我又研究了一些,在构图方面取得了更大的进步:

   f2 =: (2 & f) @ (1 & f) @ (0 & f)
   f2 x_0
4 6 2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

这行得通,但我对如何组合任意数量的函数有点迷茫。如何组合 f 任意次数,同时将其左参数绑定到递减数组的各个元素?我觉得有更多 "intrinsic" J 方法可以做到这一点,但到目前为止我还没有在文档中找到任何内容。

谢谢,如果您需要更多信息,请告诉我。

很好的问题,这就是我处理它的方式,但是当您使用 J 时,您会发现可能还有其他方法。

我的解决方案是:

   g=. 4 : '> (f~&.>)/ (<y),(<"0@i.x)'
   f=. +   NB. + is placeholder for whatever f is
   a_0 =. 3
   b_0 =. 1 + i. 10
   a_0 g b_0
4 5 6 7 8 9 10 11 12 13

分解步骤:

(<b_0),(<"0 i.a_0) NB. append boxed integers of  i. a_0 to boxed b_0
┌────────────────────┬─┬─┬─┐
│1 2 3 4 5 6 7 8 9 10  │0│1│2│
└────────────────────┴─┴─┴─┘
   (f~&.>)/ (<b_0),(<"0 i.a_0) NB. arguments of f are reversed and unboxed, f operates and then boxes result and moves to next item
┌───────────────────────┐
│4 5 6 7 8 9 10 11 12 13  │
└───────────────────────┘
   > (f~&.>)/ (<b_0),(<"0 i.a_0) NB. result is unboxed
4 5 6 7 8 9 10 11 12 13

g 的默认形式如下所示:

   gt=.  >@:(f~ &.>) / @:((<@]) , |.@:<"0@i.@[)
   a_0 gt b_0
4 5 6 7 8 9 10 11 12 13