Обработка гибких аргументов в функциях Mathematica - PullRequest
6 голосов
/ 15 декабря 2011

Это ответвление и расширение: Безопасно ли отключать Pattern :: patv?

Многие встроенные функции Mathematica допускают гибкие аргументы. В пользовательских функциях я использовал для этой цели Alternatives, но комментарии и ответы на упомянутый вопрос указывают, что это как минимум нестандартно и, возможно, нежелательно.

Позвольте мне определить фиктивную функцию foo в качестве примера.

Off[Pattern::patv]

p = {_?NumericQ, _?NumericQ};

foo[
  {x : p ..} | x : p,
  {y__} | y__,
  ops : OptionsPattern[]
] /; Max[y] <= 10  :=  bar[#, y, ops] & /@ {x}

foo принимает, в порядке:

  • объект, соответствующий шаблону p, или список таких объектов.
  • набор неявно числовых объектов с максимальным значением 10, в виде списка или последовательности аргументов (как написано, сами эти объекты могут быть числовыми списками с максимальным значением 10)
  • варианты соответствия OptionsPattern[]

Если какое-либо из этих условий не выполняется, foo[args] возвращается без оценки.

Два шаблона с использованием Alternatives (|) являются наиболее распространенными случаями, но они не являются исключительными.

Я пытаюсь понять, как лучше всего реализовать foo.

  • Какой канонический способ сделать это?

  • В чем его преимущества перед использованием Alternatives?

  • Объективно легче читать?

1 Ответ

4 голосов
/ 16 декабря 2011

Я полагаю, что есть три канонических способа работы с гибкими аргументами:

  1. что угодно: f[x_],
  2. несколько форм: f[{x : p ..}] и f[x:p],где один вызывает другой, и
  3. чередование: f[{x : p ..} | x : p].

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

Основным преимуществом чего бы то ни было, является простота создания приемлемых шаблонов, но это оставляет обработку внутренним частям функции, что увеличивает ее сложность.См. ErrorBarPlots .m файл для хорошего примера этого.В конечном счете, однако, ErrorListPlot опирается на второй метод, скрытый за фасадом первого метода.

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

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

...