Как построить собственный Каждый оператор, используя оператор Rank в Dyalog APL - PullRequest
3 голосов
/ 09 октября 2019

Я видел ответ в этом вопросе Как использовать оператор ранга вместо каждого в APL Как создать собственный Каждый оператор, использующий ранг .

Монадический Каждый f¨x может бытьпредставлен как {⊂f⊃⍵}⍤0⊢x

Диадический Каждый x f¨y может быть представлен как x{⊂(⊃⍺)f(⊃⍵)}⍤0⊢y

В терминах этого, пожалуйста, ответьте на следующие вопросы:

  1. Почему Каждый *Оператор 1017 * может быть представлен как
    Each←{⍺←⊢ ⋄ ⍺ ⍺⍺{×⎕NC'⍺':⊂(⊃⍺)⍺⍺(⊃⍵) ⋄ ⊂⍺⍺⊃⍵}⍤0⊢⍵}
  2. Что означает ⍺⍺ в приведенном выше выражении

Заранее благодарим вас за ваши ответы.

Ответы [ 2 ]

2 голосов
/ 09 октября 2019
  1. Это определение в основном объединяет монадические и диадические случаи, которые вы перечислили выше. ×⎕NC'⍺' вернет 1, если существует и 0 в противном случае, поэтому он проверяет, использовали ли вы Each монадически или двоично.

  2. ⍺⍺ слеваоперанд из допа Each. Это f в x f Each y или f Each y

0 голосов
/ 09 октября 2019

Вот тот же объединенный оператор в более подробной форме с комментариями:

Each←{  ⍝ Monadic operator; ⍺⍺ is the operand function
    ⍺←⊢  ⍝ If called monadically ⍺ won't do anything (it will be the no-op function)
    Apply←{  ⍝ This operator applies its operand function (⍺⍺) to disclosed argument(s)
             ⍝ and encloses the result
        ×⎕NC'⍺': ⊂ (⊃⍺) ⍺⍺ (⊃⍵)  ⍝ if we have a left argument, apply ⍺⍺ dyadically (enclose both)
                 ⊂      ⍺⍺ (⊃⍵)  ⍝ otherwise, apply ⍺⍺ just on the enclosed ⍵
    }
    ⍝ Now we're ready to apply to separate elements:
    ⍺ ( (⍺⍺ Apply)⍤0 ) ⍵  ⍝ Even though we have ⍺ here, it may be ⊢ causes a monadic call to ⍺⍺
}
...