Что более эффективно в Haskell; сопоставление шаблонов или вложенные операторы if/case?
Мне просто интересно узнать эффективность сопоставления шаблонов в Haskell. Каков простой случай, когда совпадение шаблонов было бы лучше, чем вложенные операторы if/case, а затем наоборот?
Спасибо за вашу помощь.
Ответ 1
В Haskell case и соответствие шаблонов неразрывно связаны; вы не можете иметь один без другого. if p then e1 else e2 - синтаксический сахар для case p of { True -> e1; False -> e2 }. По этим причинам я думаю, что невозможно привести примеры, которые вы просите; в Core Haskell все эквивалентно case.
В языках семейства ML оптимизатор часто может делать очень впечатляющие вещи со сложными совпадениями шаблонов. Это сложнее для компиляторов Haskell; из-за ленивой оценки компилятору шаблона-шаблона не разрешается изменять порядок определенных тестов. Другими словами, если вы вставляете операторы case по-разному, вы можете получить другую производительность, но в Haskell вы также получаете другую семантику. Поэтому, как правило, компилятор не возится с ним.
Насколько можно писать собственный код, можно с уверенностью предположить, что код с наименьшим числом выражений является лучшим (имея в виду, что один if эквивалентен одному выражению case).
Ответ 2
Я не подтвердил это, но я думаю, что обе формы станут вложенными case-выражениями при переходе на ядро Haskell компилятором. Лучший способ узнать, спрашивает сам компилятор. В GHC вы можете включить дамп основной промежуточной программы, используя аргументы:
Перед упрощением: -ddump-ds
После упрощения: -ddump-simpl
Ответ 3
В соответствии со спецификацией они семантически эквивалентные. Это, конечно, не обязательно означает, что они реализованы одинаково, но я был бы лично удивлен, если бы была разница в достойном компиляторе.