Который является более эффективным в Haskell; сопоставление с образцом или вложенные операторы if / case? - PullRequest
11 голосов
/ 09 января 2009

Мне просто интересно узнать об эффективности сопоставления с образцом в Haskell. В каком простом случае сопоставление с образцом будет лучше, чем вложенные операторы if / case, а затем наоборот?

Спасибо за вашу помощь.

Ответы [ 3 ]

20 голосов
/ 09 января 2009

В Haskell, case и сопоставление с образцом неразрывно связаны; Вы не можете иметь одно без другого. if p then e1 else e2 является синтаксическим сахаром для case p of { True -> e1; False -> e2 }. По этим причинам, я думаю, невозможно привести примеры, которые вы просите; в Core Haskell все равно case.

На языках семейства ML оптимизатор часто может делать очень впечатляющие вещи с помощью сложных сопоставлений с образцом. Это сложнее для компиляторов Haskell; из-за отложенной оценки компилятору сопоставления с образцом не разрешается переупорядочивать определенные тесты. Другими словами, если вы вложите операторы case по-разному, вы можете получить разную производительность, но в Haskell вы также получите другую семантику. Так что, как правило, компилятор с этим не связывается.

Что касается способа написания собственного кода, то можно с уверенностью предположить, что код с наименьшим количеством регистр-выражений является лучшим (имея в виду, что одно if эквивалентно одному выражению-регистру).

7 голосов
/ 09 января 2009

Я не подтвердил это, но я думаю, что обе формы станут вложенным регистром выражения при переводе компилятором в ядро ​​Haskell. Лучший способ узнать это - спросить сам компилятор. В GHC вы можете включить дамп основной промежуточной программы, используя аргументы:

  • До упрощений: -ddump-ds
  • После упрощений: -ddump-simp
5 голосов
/ 12 января 2009

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

...