Ответ 1
Первый считается лучшим стилем по двум причинам.
Прежде всего: многие люди скажут, что это выглядит лучше, так как вам не нужно набирать все ==
. Разумеется, это очень субъективная причина. Кроме того, обычно вы даже не вводите новый оператор case, а просто сопоставляете аргументы в списке аргументов функции следующим образом:
foo 1 b c = ... -- etc
...
foo _ b c = ... -- for the "otherwise" part
Это делает код еще более компактным и читаемым, что многим нравится.
Во-вторых, на самом деле существует семантическая разница. Представьте, что у вас есть такой тип данных, как это:
data Cake = Apple | Cheese | Cream
Если вы используете первый метод, вы сопоставляетесь с конструкторами в выражении case..of
:
case a of
Apple -> "fruit"
_ -> "not fruit"
Однако, если вы попытаетесь сделать какое-то охраняемое выражение, например:
| a == Apple = "fruit"
| otherwise = "not fruit"
... на самом деле это не будет работать, потому что тип Cake
не имеет экземпляра Eq
, поэтому вы не можете использовать ==
для сравнения двух значений. Представление экземпляра Eq
(с deriving (Eq)
после определения данных) не всегда требуется, поэтому не делать этого в этом случае может быть значительным.