Я думаю, sepp2k уже ответил на большинство вопросов, но я хотел бы добавить пару моментов, которые могут прояснить, как F # / OCaml-компилятор интерпретирует код, и объяснить некоторые общие применения.
Относительно символа '
- это просто часть имени (допустимый идентификатор начинается с буквы, а затем содержит одну или несколько букв, цифр или '
символов). Обычно он используется, если у вас есть функция или значение, очень похожее на какое-то другое, но каким-то образом new или изменение .
В вашем примере xs
- это список, который должен быть суммирован, а сопоставление с образцом разлагает список и дает вам новый список (без первого элемента), который нужно суммировать, поэтому он называется xs'
Другое частое использование - это объявление локальной функции полезности, которая реализует эту функциональность и принимает дополнительный параметр (как правило, при написании хвостово-рекурсивного кода):
let sum list =
let rec sum' list res =
match list with
| [] -> res
| x::xs -> sum' xs (res + x)
sum' list 0
Тем не менее, я думаю, что обычно есть более подходящее имя для функции / значения, поэтому я стараюсь избегать использования '
при написании кода (я думаю, что он не особо читабелен и, кроме того, не правильно раскрашивает StackOverflow!)
Относительно символа ::
- как уже упоминалось, он используется для создания списков из одного элемента и списка (1::[2;3]
создает список [1;2;3]
). Однако стоит отметить, что символ можно использовать двумя различными способами, и он также интерпретируется компилятором двумя различными способами.
При создании списка вы используете его как оператор, который создает список (так же, как при использовании +
для добавления двух чисел). Однако, когда вы используете его в конструкции match
, он используется как шаблон , который является другой синтаксической категорией - шаблон используется для декомпозиции списка в элемент и остаток, и это успешно для любого непустого списка:
// operator
let x = 0
let xs = [1;2;3]
let list = x::xs
// pattern
match list with
| y::ys -> // ...