Подтвердить что ты не робот

F # underscore: почему бы просто не создать имя переменной?

Чтение о F # сегодня, и я не понимаю одно:

От: http://msdn.microsoft.com/en-us/library/dd233200.aspx

вам нужен только один элемент кортежа, подстановочный знак (подчеркивание) можно использовать для , чтобы избежать создания нового имени для переменной, которая вам не нужна

let (a, _) = (1, 2)

Я не могу придумать, какое время я был в этой ситуации. Почему бы вам избежать создания имени переменной?

4b9b3361

Ответ 1

Интересный вопрос. Здесь много компромиссов.

Ваши сравнения были с языком программирования Ruby, поэтому, возможно, первым компромиссом, который вы должны рассмотреть, является статическая типизация. Если вы используете шаблон x, _, _, то F # знает, что вы обращаетесь к первому элементу тройки ровно трех элементов и будете применять это ограничение во время компиляции. Руби не может. F # также проверяет шаблоны для полноты и избыточности. Опять же, Ruby не может.

В ваших сравнениях также использовались только плоские шаблоны. Рассмотрим шаблоны _, (x, _) или x, None | _, Some x или [] | [_] и т.д. Это не так легко перевести.

Наконец, я бы упомянул, что стандартный ML - это язык программирования, связанный с F #, и он предоставляет операторы с именем #1 и т.д. для извлечения первого элемента кортежа с произвольным числом элементов (см. здесь), поэтому эта идея была реализована и отброшена десятилетиями назад. Я считаю, это связано с тем, что нотация SML #n завершается непонятными сообщениями об ошибках в рамках ограничений типа системы. Например, функция, использующая #n, не дает понять, что такое ядро ​​кортежа, но функции не могут быть общими для атрибута кортежа, поэтому это должно привести к сообщению об ошибке, в котором говорится, что вы должны предоставить больше информации о типе, но многие пользователи обнаружили это смущает. При использовании подхода CAML/OCaml/F # такой путаницы нет.

Ответ 2

Потому что вам не нужно значение. Я часто использую это. Он документирует тот факт, что значение не используется и сохраняет имена переменных unused, dummy и т.д. Отличная функция, если вы спросите меня.

Ответ 3

Связывание let, которое вы указали, является примером языкового средства под названием соответствие шаблонов, которое может использоваться для разрушения многие типы, а не только кортежи. В совпадениях с образцами подчеркивания являются идиоматическим способом выражения того, что вы не будете ссылаться на значение.

Прямой доступ к элементам кортежа может быть более кратким, но менее общим. Согласование шаблонов позволяет вам взглянуть на структуру некоторых данных и отправить в соответствующий обработчик.

match x with
| (x, _, 20) -> x
| (_, y, _)  -> y

Это совпадение с шаблоном вернет первый элемент в x, только если третий элемент 20. В противном случае он возвращает второй элемент. После того, как вы выходите за рамки тривиальных случаев, подчеркивания являются важным средством для чтения. Сравните приведенное выше с:

match x with
| (x, y, 20) -> x
| (x, y, z)  -> y

В первом примере кода гораздо проще определить, какие привязки вам интересны в шаблоне.

Ответ 4

Иногда метод возвращает несколько значений, но код, который вы пишете, интересует только несколько (или один) из них. Вы можете использовать несколько подчеркиваний, чтобы по существу игнорировать значения, которые вам не нужны, а не иметь кучу переменных, зависающих в локальной области.