我如何在 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
我有一个二元函数,称之为 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