我尝试了一下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
答案 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
在所有这些相等字符看来都是具有欺骗性的,并且k
和x
彼此之间的距离比结果更远。 k==x = res
看起来更整洁。