Является ли образцовое сопоставление более результативным, чем защита?

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

Чтение этого было неожиданным для меня, потому что я думал, что GHC смог оптимизировать некоторые (возможно, не все) решения соответствия шаблонов во время компиляции. Это вообще происходит?

Случай, например:

f 1 = 3
f 2 = 4

против

f' a | a == 1 = 3
     | a == 2 = 4

Do f и f' скомпилировать с тем же количеством инструкций (например, в Core и/или ниже)?

Является ли ситуация другой, если я сопоставляю шаблон с конструктором вместо значения? Например. если GHC видит, что функция из местоположения всегда вызывается с помощью одного конструктора, оптимизирует ли этот вызов таким образом, чтобы исключить проверку времени выполнения? И если да, можете ли вы привести пример, показывающий, что делает оптимизация?

В заключение

Что хорошо знать об этих двух подходах с точки зрения производительности?

Когда предпочтительнее производительность?

Ответ 1

Не обращайте внимания на шаблоны против охранников, вы можете также спросить о if vs. case.

Сравнение шаблонов предпочтительнее проверок равенства. Проверка равновесия на самом деле не является естественным делом в Haskell. Логическая слепота - одна из проблем, но, кроме того, полная проверка равенства часто просто невозможна – например бесконечные списки никогда не сравнится с равными!

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

Я обычно предпочитаю шаблоны – потому что они просто приятнее и могут быть более эффективными. Проверки равенства будут либо дорогими, либо, возможно, более дорогими, а просто неидиоматичны. Используйте только логическую оценку, когда вам нужно, в противном случае придерживайтесь шаблонов (которые могут быть в гвардии тоже!)