Чем `{⊂⍵}` отличается от простого `⊂`?

Я читаю недавний APL с 1978 года Хуи и Кромберга и в обсуждении из (трафарет) приводят следующий пример:

      {⊂⍵}⌺5⊢'abcde'
   abc   abcd  abcde  bcde   cde

Почему {⊂⍵} нужно вместо ? Я все еще довольно новичок в APL, но я бы наивно думал, что в общем случае {f⍵} должно быть эквивалентно f при монадическом вызове.

Эмпирически я вижу, что это не так:

      ⊂⌺5⊢'abcde'
DOMAIN ERROR
      ⊂⌺5⊢'abcde'
      ∧

Но я не понимаю, почему.


person ssfrr    schedule 28.06.2020    source источник


Ответы (1)


Вы абсолютно правы в том, что {⊂⍵} эквивалентно при монадическом вызове, однако в соответствии с документация:

f вызывается диадически с векторным левым аргументом, указывающим для каждой оси количество элементов заполнения и с какой стороны; положительные значения означают, что заполнение предшествует значениям массива, отрицательные значения означают, что заполнение следует за значениями массива.

Мы можем проиллюстрировать это, заставив функцию возвращать вложение обоих аргументов вместе:

      {⊂⍺ ⍵}⌺5⊢'abcde'
┌─────────┬─────────┬─────────┬──────────┬──────────┐
│┌─┬─────┐│┌─┬─────┐│┌─┬─────┐│┌──┬─────┐│┌──┬─────┐│
││2│  abc│││1│ abcd│││0│abcde│││¯1│bcde │││¯2│cde  ││
│└─┴─────┘│└─┴─────┘│└─┴─────┘│└──┴─────┘│└──┴─────┘│
└─────────┴─────────┴─────────┴──────────┴──────────┘

Этот левый аргумент предназначен для соответствия требованиям левого аргумента , поэтому добавленное заполнение может быть легко удалено:

      {⊂⍺↓⍵}⌺5⊢'abcde'
┌───┬────┬─────┬────┬───┐
│abc│abcd│abcde│bcde│cde│
└───┴────┴─────┴────┴───┘

Если вам нужен неявный операнд вместо {⊂⍵}, вы можете использовать ⊢∘⊂ (что эквивалентно {⍺⊢⊂⍵} и, следовательно, {⊂⍵}) или, в версии 18.0, ⊂⍤⊢ (что эквивалентно {⊂⍺⊢⍵} и, следовательно, {⊂⍵}).

person Adám    schedule 28.06.2020