Я где-то читал, что совпадение шаблонов происходит во время выполнения, а не во время компиляции. (Я ищу источник, но не могу его найти в данный момент.) Это правда? И если да, то функции охраны в функциях имеют одинаковую производительность?Является ли образцовое сопоставление более совершенным, чем охранники?
Чтение это было удивительно для меня, потому что я думал, что GHC смог оптимизировать некоторые (возможно, не все) решения соответствия шаблону во время компиляции. Это вообще происходит?
Случай, например:
f 1 = 3
f 2 = 4
против
f' a | a == 1 = 3
| a == 2 = 4
ли f
и f'
компилировать в том же количестве инструкций (например, в активной зоне и/или ниже)?
Является ли ситуация другой, если я сопоставляю шаблон с конструктором вместо значения? Например. если GHC видит, что функция из местоположения всегда вызывается с помощью одного конструктора, оптимизирует ли этот вызов таким образом, чтобы исключить проверку времени выполнения? И если да, можете ли вы привести мне пример, показывающий, что делает оптимизация?
В заключение
Что хорошо знать об этих двух подходов с точки зрения производительности?
Когда предпочтительнее производительность?
Вы спрашиваете, как получить основной вывод от GHC или как использовать критерий? – jberryman
Релевантно: [Haskell GHC: какая временная сложность совпадения шаблона с конструкторами N?] (Http://stackoverflow.com/q/9027384/2751851) – duplode
Я бы склонен думать, что сопоставление шаблонов выполняется быстрее, учитывая что экземпляры 'Eq' обычно основаны на сопоставлении шаблонов в любом случае. – AJFarmar