Среднее арифметическое вперед или назад?
Я знаком с этим способом сделать среднее арифметическое в J:
+/ % #
Но это также показано здесь как
# %~ +/
Являются ли эти две версии взаимозаменяемыми, и если нет, то когда мне следует использовать одну против другой?
3 ответа
Диадические ~
меняет аргументы глагола. x f~ y
эквивалентно y f x
, Ты используешь ~
когда вы хотите изменить аргументы глагола.
Одним из наиболее распространенных применений является состав вилок и крючков. Например, потому что y f (g y)
является (f g) y
ты можешь использовать ((f~) g) y
когда ты нуждаешься (g y) f y
,
В примере с обратным средним я не вижу причины, по которой один из способов был бы более эффективным, чем другой (форма вилки VVV), но поскольку вилки в 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
Монадическая~
это наречие "Reflex", которое заставляет измененный глагол работать как диада, дублируя единственный аргумент для левого и правого. Хотя это еще один способ упорядочить ваши аргументы, он сильно отличается от диадического ~
, *~ 4
является 16
потому что вы умножаете y
сам по себе (y * y
).