2014-01-23 3 views
6

Для эволюции от APL к J, Какова мотивация введения fork? Наверное, неплохо иметь (+/ % #) для вычисления среднего значения, но это также затрудняет чтение более длинного глагольного поезда. Столкнувшись с этим компромиссом, есть ли какие-либо веские причины для изобретателя APL выбрать этот стиль в J?Какова мотивация J, чтобы представить fork

+2

Ваш собственный ответ достаточно хорошо излагает эту тему. Но я хотел бы добавить, почему IMHO большинство людей считают '(+ /% #)' труднее читать, чем '{(+/⍵) ÷ ≢⍵}'. 1. Скобки '{}' четко идентифицируют, что определяется новая функция; это не совсем ясно в молчаливом стиле J, и это делает более сложные выражения более трудными для чтения (= синтаксический разбор) 2. Синтаксис для объединения существующих функций одинаковый, независимо от того, работаете ли вы на функциональной глубине 0 (или обычном программировании) или (например, функциональное программирование): '(+/A) ÷ ≢A' против' {(+/⍵) ÷ ≢⍵} 'и т. д. 3. Символы APL более четкие, что облегчает их чтение. – Tobia

ответ

4

Благодарим за ответ Боба. Чтобы сделать это сильнее, теперь я узнал, что необходимость вилки, как показано ниже.

  • Мотивация введения вилки заключается в реализации подразумеваемого программирования в качестве реализации Combinatory logic. для этого вам нужны сортировочные комбинаторы (например, s-k basis on wiki), а hook/fork образуют полную основу. Вилка или ее эквивалент действительно неизбежны для этой цели.

  • Концепция вилки является естественным, если вы думаете о f + g, f * g. В математике они обычно означают f(x) + g(x) и f(x) * g(x).

  • Это обсуждение объяснено красиво в Roger Hui's essay on verb trains.

+0

Я думаю, что ваша вторая пуля важна. Для меня J-поезда чувствуют себя как более высокоуровневый способ выразить что-то вроде «sum = foldl (+) 0' (или' sum =: +/'в J) по сравнению с ручным циклом, добавляющим счетчик. И наоборот, когда я вижу выражение формы «x + f (x)» или «x * f (x)», я сразу же думаю «эй, это крючок», даже вне J. – FireFly

3

Я полагаю, что у вилки есть мотивация объединения существующих функций для формирования новой функции. Состав функций в J представлен @: или @ для создания новой функции из функций f и g, f @: g. Который означает взять результаты g и обработать их с помощью f

Fork делает то же самое, но позволяет обрабатывать результаты двух разных функций (справа и слева) с помощью третьей функции (центральный зуб). Таким образом (f h g) применяет результаты f и g к центральному зубцу h. Конструкция fork интересна тем, что является способом генерации новой функции путем группирования функций без необходимости использования дополнительного символа. Как вы указали, оно расширяемо, так что (a b c d e) читается как (a b (c d e)), где результат fork c d e используется как правый угол.

Смежные вопросы