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