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,并且 k
和 x
彼此之间的距离比结果更远。 k==x = res
看起来更整洁。
我试着练习了一下 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,并且 k
和 x
彼此之间的距离比结果更远。 k==x = res
看起来更整洁。