Во время моего ответа на этот question мне пришло в голову, что трудно сопоставить конечный диапазон элементов. Со встроенными шаблонами вы можете сопоставить 1 элемент (_
), 1 или более элементов (__
) или ноль или более элементов (___
). Чтобы сопоставить более одного элемента, я использовал PatternSequence
, как этот
a:PatternSequence[_,_,_]
или, более общий
a:[email protected]@Array[_&,3].
(Используя Condition
, также работал.) Чтобы соответствовать диапазону от n до m элементов, мы могли бы сделать
a:[email protected]@( PatternSequence @@@ Array[_&, {n,m}] ),
но это довольно запутанный способ выполнить что-то, что можно сделать с помощью
a__ /; n <= Length[{a}] <= m.
Однако это вызывает интересный вопрос, используя формулу Condition
, она проста в соответствии с диапазоном от 0 до n,
a___ /; Length[{a}] <= n,
но может ли это быть сделано с использованием шаблонов в одиночку, т.е. без использования Condition
(/;
)? Более конкретно, как можно было бы сопоставить 0 элементов без добавления условия? Кроме того, что быстрее?