Среднее арифметическое вперед или назад?

Я знаком с этим способом сделать среднее арифметическое в 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).

Другие вопросы по тегам