Объяснение сопоставления с образцом по сравнению с переключателем

Система не очищает память при отпускании ее через delete(). Таким образом, содержимое остается доступным, пока память не будет назначена для повторного использования и перезаписана.

56
задан Nathan W 14 October 2008 в 22:05
поделиться

7 ответов

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

Обратный, когда я только что поглядел на сопоставление с образцом и думал, что это был прославленный оператор переключения, я думаю, что не имел опыта при программировании с алгебраическими типами данных (кортежи и дизъюнктные объединения) и не вполне видел, что сопоставление с образцом было и конструкцией управления и обязательная конструкция. Теперь, когда я программировал с F#, я наконец "получаю его". Прохлада сопоставления с образцом происходит из-за слияния функций, найденных на языках функционального программирования, и таким образом, это нетривиально для outsider-looking-in для понимания.

я пытался подвести итог одного аспекта того, почему сопоставление с образцом полезно во втором из короткого ряда блога с двумя частями на дизайне API и языке; выезд часть первая и часть вторая .

37
ответ дан Brian 7 November 2019 в 16:42
поделиться

Выборка от эта статья блога:

Сопоставление с образцом имеет несколько преимуществ перед отправкой метода и операторами переключения:

  • соответствия Шаблона могут реагировать на ints, плавания, строки и другие типы, а также объекты.
  • соответствия Шаблона могут реагировать на несколько различных значений одновременно: параллельное сопоставление с образцом. Отправка метода и переключатель ограничены единственным значением, например, "этим".
  • Шаблоны могут быть вложены, позволив отправку по деревьям произвольной глубины. Отправка метода и переключатель ограничены невложенным случаем.
  • Или-шаблоны позволяют подшаблонам быть совместно использованными. Отправка метода только позволяет совместно использовать, когда методы от классов, которые, оказывается, совместно используют базовый класс. Иначе необходимо вручную факторизовать общность в отдельную функцию (дающий его имя) и затем вручную вставить вызовы от всех соответствующих мест до ненужной функции.
  • Сопоставление с образцом обеспечивает проверку избыточности, которая фиксирует ошибки.
  • Вложенные и/или параллельные соответствия шаблона оптимизированы для Вас компилятором F#. Эквивалентное OO должно быть записано вручную и постоянно повторно оптимизироваться вручную во время разработки, которая предельно утомительна и подвержена ошибкам так производственное качество, код OO имеет тенденцию быть чрезвычайно медленным в сравнении.
  • Активные шаблоны позволяют Вам вводить пользовательскую семантику отправки.
15
ответ дан Jon Harrop 7 November 2019 в 16:42
поделиться

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

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

type expr =
    | Int of int
    | Var of string
    | Add of expr * expr
    | Mul of expr * expr;;

let rec d(f, x) =
    match f with
    | Var y when x=y -> Int 1
    | Int _ | Var _ -> Int 0
    | Add(f, g) -> Add(d(f, x), d(g, x))
    | Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));;

Кроме того, потому что сопоставление с образцом является статической конструкцией для статических типов, компилятор может (i) проверять покрытие всех случаев (ii), обнаруживают избыточные ответвления, которые никогда не могут соответствовать никакому значению (iii), предоставляют очень эффективному внедрению (переходы и т.д.).

30
ответ дан Bruno De Fraine 7 November 2019 в 16:42
поделиться

Первое, что пришло на ум:

  1. компилятор может сказать, не покрыли ли Вы все возможности в своих соответствиях
  2. , можно использовать соответствие в качестве присвоения
  3. , Если у Вас есть дизъюнктное объединение, каждое соответствие может иметь различный 'тип'
8
ответ дан Benjol 7 November 2019 в 16:42
поделиться

Переключатель является двумя передними колесами.

Сопоставление с образцом является всем автомобилем.

6
ответ дан yfeldblum 7 November 2019 в 16:42
поделиться

Шаблон соответствует в OCaml, в дополнение к тому, чтобы быть более выразительным, как упомянуто несколькими способами, которые были описаны выше, также дайте некоторые очень важные статические гарантии. Компилятор докажет для Вас, что анализ случая, воплощенный Вашим оператором соответствия шаблона:

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

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

3
ответ дан zrr 7 November 2019 в 16:42
поделиться

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

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

-2
ответ дан Pitarou 7 November 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: