Ответ 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).