Haskell 与水平线混淆

Haskell gets confused with horizontal lines

我试着练习了一下 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]

如果您调用此函数 rems k x,它会从列表 x 中删除每个 k。我知道它应该可以工作,因为我们在大学里就把它写下来了。

我正在使用这个 IDE:https://repl.it/languages/haskell

知道 otherwise 不是像 = 那样的关键字或特殊符号可能会很有用,它实际上只是一个在序言中定义为 True 的布尔值。即,带有 otherwise 的守卫在语法上与任何其他守卫的工作方式相同,只是条件很简单。你也可以这样写

rems _ [] = []
rems k (x:xs)
  | k == x  = rems k xs
  | True    = [x] ++ rems k xs

我上面选择的对齐方式(所有=对齐并且至少有两个 spaces远离guard-condition)是完全一个品味问题,但我认为它有助于避免混淆,就像您发现自己遇到的那样。

顺便说一句,[x] ++ ... 可以缩短为 x : ...。写函数的首选形式是

rems _ [] = []
rems k (x:xs)
  | k==x       = rems k xs
  | otherwise  = x : rems k xs

大多数人对齐 = 但只使用一个 space。没关系,但是 IMO k == x = res 看起来具有欺骗性,因为所有这些 equals-characters,并且 kx 彼此之间的距离比结果更远。 k==x = res 看起来更整洁。