Почему работают две одинаковые фразы глагола J, но только одна из них работает со степенным соединением Dynami c? - PullRequest
3 голосов
/ 14 января 2020

Цепочка глаголов ''-:] работает так, как я ожидаю.

   (''-:])''
1
   (''-:])'non-empty'
0

Она также работает так, как я ожидаю с динамическим c силовым соединением.

   'empty'[^:(''-:])''
empty
   'empty'[^:(''-:])'non-empty'
non-empty

Фраза глагола ''&-: дает те же результаты, что и следовало ожидать.

   (''&-:)''
1
   (''&-:)'non-empty'
0

Когда я пытаюсь использовать ''&-: с мощным соединением Dynami c, J выдает ошибку домена, а я - не понимаю почему. В чем разница между этим вариантом использования и всеми остальными?

   'empty'[^:(''&-:)''
|domain error
|   'empty'    [^:(''&-:)''
   'empty'[^:(''&-:)'non-empty'
|domain error
|   'empty'    [^:(''&-:)'non-empty'

Не пытается ли сообщение под строкой "ошибка домена" указать мне что-то конкретное c?

Мой фактический Случай использования заключается в замене пустых строк другой строкой. Если у кого-нибудь есть какие-либо предложения по лучшим способам сделать это, я буду признателен.

1 Ответ

3 голосов
/ 14 января 2020

Хороший вопрос, и тот, который заставил меня покопаться в моей ссылке Nuvo c для (^:) Power Conjunction https://code.jsoftware.com/wiki/Vocabulary/hatco#Common_Uses_2
Я имею в виду Nuvo c, так как эта ссылка сейчас используется вместо словаря J.

Насколько я могу судить, проблема в том, что у вас есть функция dyadi c (ваши аргументы 'empty' и ''), и вы пытаетесь ее форсировать быть монади c с вашим тестом (''&-:)

   'empty'[^:(''&-:) ''
|domain error
|   'empty'    [^:(''&-:)''

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

Если мы изменим ваш тест на форк ('' -: ]), он будет работать, потому что теперь аргументы x и y обрабатываются соответствующим образом. ] выбирает аргумент y, а существительное в левом зубце не требует аргументов.

   'empty'[^:(''-:]) ''  NB. turn the test into a fork
empty

Другой способ, который работает, - это изменить аргумент x в глагол, используя "_, который создает глагол бесконечного ранга и при вызове вернет результат, который вы ожидаете. Это снова избавляет от проблемы путаницы dyadi c monadi c, так что ваш оригинальный тест теперь работает. Скобки вокруг empty"_ необходимы для отделения силового соединения ^: от глагола.

   ('empty'"_) ^:(''&-:) '' NB. turn the x argument into a verb
empty

Другие подходы, которые вы можете использовать, - взглянуть на наречие Amend } https://code.jsoftware.com/wiki/Vocabulary/curlyrt#dyadic

...