Haskell与水平线混淆

时间:2019-06-22 17:29:06

标签: function haskell syntax definition guard-clause

我尝试了一下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

1 个答案:

答案 0 :(得分:8)

知道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

大多数人将=对齐,但仅使用一个空格。可以,但是IMO k == x = res在所有这些相等字符看来都是具有欺骗性的,并且kx彼此之间的距离比结果更远。 k==x = res看起来更整洁。