我很熟悉J中的算术平均值:
+/ % #
但这里也显示为
# %~ +/
这两个版本可以互换吗?如果不能,我应该在什么时候使用一个而不是另一个?
二元~
反转动词的参数。x f~ y
等于y f x
。当你想要反转一个动词的论点时,你可以使用~
。
最常见的用途之一是用于fork和hooks组合。例如,因为y f (g y)
是(f g) y
,所以当您需要(g y) f y
时,可以使用((f~) g) y
。
在反向平均的例子中,我真的看不出一种方式会比另一种方式更有效的原因(V V V形式的分叉),但因为J中的分叉可以是非对称的(在N V V形式中),我可以看到一些理由,反转分叉的中间时间将是一个优势。例如:
(5 # $) 1 2 3 NB. (N V V) form
3 3 3 3 3
(5 #~ $) 1 2 3 NB. (N V~ V) becomes effectively (V V N)
5 5 5
($ # 5) 1 2 3 NB. (V V N) is a syntax error
|syntax error
| ($#5)1 2 3
二元~
是"被动"副词,它交换左参数和右参数。因此,x f~ y
与y f x
相同。+/ % #
和# %~ +/
是等价的。2 % 5
给出0.4
,但2 %~ 5
给出2.5
。
可以方便地检查正在处理的一行的结果。虽然您可能会测试一些更复杂的东西,但您可以通过重复最后一行并只在左边添加内容而不重新排列或添加括号来检查自己。
string =. 'J is beyond awesome.'
'e' = string
0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0
string #~ 'e' = string
eee
一元形的~
是"反射"副词,它使修饰后的动词作为一个二分体来操作,在左和右都重复单个参数。虽然这是另一种排列参数的快捷方式,但它与二元~
有很大不同。*~ 4
是16
,因为您将y
乘以自身(y * y
)。