Haskell与水平线混淆

Phi*_*säß -2 syntax haskell function 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]
Run Code Online (Sandbox Code Playgroud)

如果您将其称为rems kx,则此函数将从列表x中删除每个k 。我知道它应该工作,因为我们在大学里写下来了。

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

lef*_*out 8

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

rems _ [] = []
rems k (x:xs)
  | k == x  = rems k xs
  | True    = [x] ++ rems k xs
Run Code Online (Sandbox Code Playgroud)

我在上面选择的对齐方式(所有=对齐方式都与保护条件保持至少两个距离)完全是一种品味问题,但是我认为它有助于避免像您遇到的那种混乱。

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

rems _ [] = []
rems k (x:xs)
  | k==x       = rems k xs
  | otherwise  = x : rems k xs
Run Code Online (Sandbox Code Playgroud)

大多数人将=s 对齐,但仅使用一个空格。这是确定的,但IMO k == x = res看起来与所有这些等号字符欺骗性,并kx彼此渐行渐远高于从结果。k==x = res似乎比较整齐。