Понимание сопоставления шаблона с поддержкой оператора
-
27-09-2019 - |
Вопрос
В «программировании F #» я столкнулся с образкой на шаблон, как этот (я немного упростил):
let rec len list =
match list with
| [] -> 0
| [_] -> 1
| head :: tail -> 1 + len tail;;
Практически я понимаю, что последний матч признает голову и хвост списка. Концептуально я не понимаю, почему это работает. Насколько я понимаю, :: - это оператор минус, который добавляет ценность в положении руководителя списка, но это не выглядит так, как будто он используется как оператор здесь. Должен ли я понять это как «специальный синтаксис» для списков, где :: интерпретируется как оператор или «шаблон матча» в зависимости от контекста? Или одна и та же идея продлена для типов, кроме списков, с другими операторами?
Решение
В дополнение к ответу Брайана, есть несколько очков, которые стоит отметить. То h::t
Синтаксис можно использовать как в качестве оператора а также Как шаблон:
let l = 1::2::[] // As an operator
match l with x::xs -> 1 | [] -> 0 // As a pattern
Это означает, что это немного специальная конструкция, потому что другие операторы (например, +
) не может быть использован в качестве моделей (для разложения результата обратно к аргументам оператора) - очевидно, для +
, это было бы неоднозначно.
Кроме того, шаблон [_]
Интересно, потому что это пример вложенного узора. Он составляет:
_
- узор подчеркивания, который соответствует любому значению и не связывает никаких символов[ <pattern> ]
- одноэтаментный список списка, который соответствует спискам с одним элементами и соответствует элементу списка со вложенным<pattern>
.
Вы также можете написать match 1::[] with | [x] -> x
который будет вернуть значение одного элемента (в этом случае 1).
Другие советы
Это специальный синтаксис для списков. Вы можете думать о list
Тип как дискриминируемый союз.
type list<'T> = // '
| Nil
| Cons of 'T * list<'T>
за исключением того, что есть специальный синтаксис, который делает Nil
быть []
а также Cons(h,t)
быть h::t
. Отказ Тогда это просто нормальный образец, сопоставив на дискриминируемый союз. Это помогает?
(Возможно, увидеть также Это вход в блоге.)
Используется в качестве формата или формально pattern
, «Список» сопоставляется с тремя шаблонами:
] означает, что список пуст
_] означает, что список имеет один элемент, поскольку вам все равно, что это элемент, так что просто положите _ там, вы также можете использовать [A].
Глава :: Хвост означает, что у списка есть две части: голова и хвост.
Вы можете просмотреть сопоставление рисунка F # как мощный, если потом иначе структура.