Что более эффективно в Haskell;сопоставление с образцом или вложенные операторы if/case?

StackOverflow https://stackoverflow.com/questions/426953

  •  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-простой

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top