Понимание сопоставления шаблона с поддержкой оператора

StackOverflow https://stackoverflow.com/questions/2846586

  •  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 # как мощный, если потом иначе структура.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top