Что более эффективно в 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

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