J @ работает не так, как ожидалось
-
21-08-2019 - |
Вопрос
Я только начинаю пытаться освоить язык J, и меня смущает следующее:
1 2 +/@{ i.4
1 2
+/ 1 2 { i.4
3
когда в документации для @ говорится:"x u@v y ↔ u x v y"
Я предполагаю, что просто путаю одну часть речи с другой, но не могу в этом разобраться
кроме того, как мне определить, к какому типу речи относится имя?
Решение
NB. u b. 0 returns the rank of u NB. the rank of a verb determines the arguments it applies to at a time NB. monadic + y applies to atoms; dyadic x + y applies to pairs of atoms + b. 0 0 0 0 NB. monadic +/ y and dyadic x +/ y apply to anything (unbounded rank) +/ b. 0 _ _ _ NB. monadic { y applies to arrays of atoms; NB. dyadic x { y applies to pairs of atoms and anything { b. 0 1 0 _ NB. u @ v has the rank of v +/@{ b. 0 1 0 _ NB. since 1 2 { i.4 returns atoms at a time, +/ works on atoms +/"0 [ 1 2 { i.4 1 2 NB. u @: v has unbounded rank +/@:{ b. 0 _ _ _ NB. +/ applies to all of 1 2 { i.4 at once +/"_ [ 1 2 { i.4 3 NB. mechanical translation to tacit form 13 : '+/ x { y' [: +/ {
Другие советы
В Википедии, по моему предвзятому мнению, есть приличная статья о ранге и о том, что это означает в контексте различных частей "речи" в J.
Но чтобы ответить на первоначальный вопрос, средство трассировки J может быть полезно для понимания того, как работает его грамматика:
require'trace'
trace '1 2 +/@{ i.4'
Это проведет вас шаг за шагом через процесс синтаксического анализа, показывая слова, используемые каждым производственным правилом, и результат, который генерирует каждое из них.
Ах, я думаю, что, возможно, я уже понял это, мне нужно использовать @:вместо того, чтобы @
1 2 +/@:{ i.4
3
именно этого я и хотел.Думаю, мне придется еще немного почитать о ранге, который является единственной разницей между @ и @: