Синтаксическая конструкция в левой части стрелки - это не обычное выражение, а шаблон.Для удобства оно очень похоже на выражение, но ведет себя совершенно иначе.Это также чисто конструкция времени компиляции.
Например, шаблон a
, как в Lettre (_, b, a)
, не будет иметь значения a
или совпадать со значением в позиции a
против значения существующей привязки с именем a
.Вместо этого он создаст новую привязку с именем a
, которая ссылается на значение в позиции a
, и затеняет любую предыдущую привязку этого имени.
Так что, если, например, значение соответствуетпротив Lettre ('a', true, [])
, a
будет, справа от стрелки, указывать значение []
.И b
будет ссылаться на true
.
Помимо того, что удобный синтаксис для привязки значений к именам в шаблонах, не позволяет значения времени выполнения в шаблонах, позволяет компилятору гарантировать полноту сопоставления с шаблоном.а также оптимизировать его во время компиляции.Если бы в шаблонах были разрешены значения времени выполнения, вам всегда приходилось бы предоставлять шаблон с подстановочными знаками, чтобы перехватить остальные возможности, поскольку вы не сможете узнать во время компиляции, какие возможности могут совпадать во время выполнения.
Я надеюсь,Теперь вы понимаете, почему не имеет смысла разрешать выражения, такие как mot.[n]
или даже имя, связанное со значением mot.[n]
, в шаблонах.
Однако существует конструкция, отдельная отшаблон, который позволяет использовать условия выполнения при сопоставлении с шаблоном, которые называются «охранниками» или «когда».Используя ваш пример:
match head with
| Lettre (ch, b, a) when ch = mot.[n] -> ...
Для этого требуется случай с подстановочным знаком вместо ch
, чтобы охватить все случаи, когда охранник не совпадает.Но поскольку у вас уже есть это, вы должны быть хорошими.