Для эволюции от APL к J, Какова мотивация введения fork? Наверное, неплохо иметь (+/ % #)
для вычисления среднего значения, но это также затрудняет чтение более длинного глагольного поезда. Столкнувшись с этим компромиссом, есть ли какие-либо веские причины для изобретателя APL выбрать этот стиль в J?Какова мотивация J, чтобы представить fork
ответ
Благодарим за ответ Боба. Чтобы сделать это сильнее, теперь я узнал, что необходимость вилки, как показано ниже.
Мотивация введения вилки заключается в реализации подразумеваемого программирования в качестве реализации 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.
Я думаю, что ваша вторая пуля важна. Для меня J-поезда чувствуют себя как более высокоуровневый способ выразить что-то вроде «sum = foldl (+) 0' (или' sum =: +/'в J) по сравнению с ручным циклом, добавляющим счетчик. И наоборот, когда я вижу выражение формы «x + f (x)» или «x * f (x)», я сразу же думаю «эй, это крючок», даже вне J. – FireFly
Я полагаю, что у вилки есть мотивация объединения существующих функций для формирования новой функции. Состав функций в 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 используется как правый угол.
- 1. Какова мотивация RequireThis?
- 2. Какова мотивация Rust's ToLowercase
- 3. Какова мотивация этого «шаблона»?
- 4. Какова мотивация свойств?
- 5. J fork оценка
- 6. Какова мотивация реализации C# ExpressionVisitor?
- 7. Какова мотивация «Использовать методы расширения?»?
- 8. Какова мотивация когерентности Пирсона в Apache Mahout
- 9. CORS - Какова мотивация внедрения предполетных запросов?
- 10. Какова была мотивация добавления флага IPV6_V6ONLY?
- 11. Какова цель JMH @Fork?
- 12. Какова цель fork()?
- 13. Какова мотивация статического полиморфизма в C++?
- 14. Какова мотивация выражения лямбда-выражения C++ 11?
- 15. Какова мотивация для классов типа Scala?
- 16. Какова мотивация использования не-Sun JRE/JDK?
- 17. Мотивация для статистических распределений
- 18. Мотивация за фантомными типами?
- 19. Grails Command Objects - Какова мотивация, стоящая за ними?
- 20. Мотивация наличия функциональных зависимостей
- 21. Какова мотивация для предупреждения компилятора C4806 (номер == bool value)?
- 22. Какова мотивация внедрения BigQuery UDF в качестве карты в mapreduce?
- 23. Какова мотивация использования Verilog или VHDL над C?
- 24. Какова мотивация того, чтобы назначить экземпляр дочернего класса переменной базового класса в стеке стека?
- 25. Какова мотивация для fpu для реализации своих регистров в стиле стека?
- 26. Мотивация для перепрограммируемых API?
- 27. Мотивация за NoSQL
- 28. Мотивация для k-медоидов
- 29. Looping fork()
- 30. fork() в fork()
Ваш собственный ответ достаточно хорошо излагает эту тему. Но я хотел бы добавить, почему IMHO большинство людей считают '(+ /% #)' труднее читать, чем '{(+/⍵) ÷ ≢⍵}'. 1. Скобки '{}' четко идентифицируют, что определяется новая функция; это не совсем ясно в молчаливом стиле J, и это делает более сложные выражения более трудными для чтения (= синтаксический разбор) 2. Синтаксис для объединения существующих функций одинаковый, независимо от того, работаете ли вы на функциональной глубине 0 (или обычном программировании) или (например, функциональное программирование): '(+/A) ÷ ≢A' против' {(+/⍵) ÷ ≢⍵} 'и т. д. 3. Символы APL более четкие, что облегчает их чтение. – Tobia