Хаскель путают с горизонтальными линиями - PullRequest
0 голосов
/ 22 июня 2019

Я попытался немного попрактиковаться в haskell, но у меня не получился следующий код:

rems :: Int -> [Int] -> [Int]
rems _ [] = []
rems k (x:xs)
  | k == x = rems k xs
  | otherwise [x] ++ rems k xs



main = print $
  rems 3 [5, 3, 2]

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

Я использую эту IDE: https://repl.it/languages/haskell

1 Ответ

8 голосов
/ 22 июня 2019

Может быть полезно знать, что 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 кажется более аккуратным.

...