-2

我试着练习一下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 kx ,此函数会从列表 x 中删除每个 k 。我知道它应该有效,因为我们在大学时就写下了它。

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

4

1 回答 1

8

otherwise知道这不是关键字或特殊符号(如)可能很有用=,它实际上只是在前奏中定义为的布尔值True。即,一个守卫在otherwise语法上与任何其他守卫相同,只是条件是微不足道的。你也可以写

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

我在上面选择的对齐方式(全部=对齐并且距离保护条件至少两个†</sup> 空格)完全是一个品味问题,但我认为它有助于避免像你发现自己那样的混淆。

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

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

†</sup>大多数人对齐=s 但只使用一个空格。没关系,但是 IMOk == x = res看起来对所有这些等号字符具有欺骗性,而且k彼此x之间的距离比结果的距离更远。k==x = res看起来更整洁。

于 2019-06-22T17:47:38.263 回答