kaipa: (Default)
kaipa ([personal profile] kaipa) wrote2011-05-06 06:09 pm

J-форк

Одна из самых изящных конструкций в языке J, на мой взгляд, это форк. Работает он так. Пусть x и z -- монадные глаголы (в J функции называются глаголами, которые могут быть монадными, то есть от одного аргумента, и диадными -- от двух), а y -- диадный глагол. Тогда форк (x y z) вычисляется как:

(x y z) a = (x a) y (z a)

Такая конструкция позволяет сэкономить много ненужных повторов и промежуточных переменных. Классический пример -- вычисление среднего:
   (+/ % #) 1 2 3 4
2.5

Здесь три глагола: +/ -- складывает элементы вектора (строго говоря, это глагол '+' и наречие '/' -- "вставка"), % -- деление, и # -- число элементов.

Просто и понятно.

Другая похожая конструкция -- hook или "крючок" -- менее наглядна. Она раскрывается как:

(x y) a = a x y a

Например, вычислим нормированный вектор, используя те же самые глаголы:
   (% +/) 1 2 3 4 5
0.0666667 0.133333 0.2 0.266667 0.333333