В последнее время я читал, что совпадение шаблонов происходит во время выполнения, а не во время компиляции. (Я ищу источник, но не могу его найти в данный момент.) Это правда? И если да, то функции охраны в функциях имеют одинаковую производительность?
Чтение этого было неожиданным для меня, потому что я думал, что GHC смог оптимизировать некоторые (возможно, не все) решения соответствия шаблонов во время компиляции. Это вообще происходит?
Случай, например:
f 1 = 3
f 2 = 4
против
f' a | a == 1 = 3
| a == 2 = 4
Do f
и f'
скомпилировать с тем же количеством инструкций (например, в Core и/или ниже)?
Является ли ситуация другой, если я сопоставляю шаблон с конструктором вместо значения? Например. если GHC видит, что функция из местоположения всегда вызывается с помощью одного конструктора, оптимизирует ли этот вызов таким образом, чтобы исключить проверку времени выполнения? И если да, можете ли вы привести пример, показывающий, что делает оптимизация?
В заключение
Что хорошо знать об этих двух подходах с точки зрения производительности?
Когда предпочтительнее производительность?