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