Может быть полезно знать, что otherwise
не является ключевым словом или специальным символом, таким как =
, на самом деле это просто логическое значение, определенное в прелюдии как True
.Т.е. охранник с otherwise
работает синтаксически так же, как любой другой охранник, только условие тривиально.Вы могли бы также написать это
rems _ [] = []
rems k (x:xs)
| k == x = rems k xs
| True = [x] ++ rems k xs
Выравнивание, которое я выбрал выше (все =
выровнены и по крайней мере два † пробела вне состояния охраны), полностью зависит от вкуса, но я думаю, что это помогает избежать путаницы, подобной той, в которой вы оказались.
Кстати, [x] ++ ...
можно сократить до x : ...
.Предпочтительной формой написания функции является
rems _ [] = []
rems k (x:xs)
| k==x = rems k xs
| otherwise = x : rems k xs
† Большинство людей выравнивают =
s, но используют только один пробел.Это нормально, но IMO k == x = res
выглядит обманчиво со всеми этими равными символами, а k
и x
дальше друг от друга, чем от результата.k==x = res
кажется более аккуратным.