Сопоставление конечного диапазона элементов с образцами

Работая над своим ответом на этот вопрос , мне пришло в голову, что это сложно соответствуют конечному диапазону элементов. С помощью встроенных шаблонов вы можете сопоставить 1 элемент ( _ ), 1 или несколько элементов ( __ ) или ноль или более элементов ( ___ ). Чтобы сопоставить более одного элемента, я использовал PatternSequence , например этот

a:PatternSequence[_,_,_]

или, в более общем смысле,

a:PatternSequence@@Array[_&,3].

(Использование Condition также могло бы работать .) Чтобы сопоставить диапазон от n до m элементов, мы могли бы сделать

a:Alternatives@@( PatternSequence @@@ Array[_&, {n,m}] ),

, но это довольно запутанный способ выполнить то, что можно сделать с помощью

a__ /; n <= Length[{a}] <= m.

. Однако это поднимает интересный вопрос, используя Condition , легко сопоставить диапазон от 0 до n,

a___ /; Length[{a}] <= n,

, но можно ли это сделать с использованием только шаблонов, то есть без использования Условие ( /; )? , как бы подобрать соответствие 0 элементов без добавления условия? Кроме того, что быстрее?

12
задан Community 23 May 2017 в 12:23
поделиться