我只是尝试编写一个函数来删除列表中的两个后续相同条目.(只要列表中有两个相同的条目,就应该删除它们.)我想出了以下递归函数,它完全按预期工作.它依赖于模式匹配:
f :: Eq a => [a] -> [a] f(a:b:xs)|a==b = f xs |otherwise = a : f (b:xs) f x=x -- if the list has less than two entries
现在我虽然我们可以重写第二种情况f=id
,但对于代码
f :: Eq a => [a] -> [a] f(a:b:xs)|a==b = f xs |otherwise = a : f (b:xs) f = id
我得到以下错误,我不明白:
\path\to\my\program.hs:1:1: Equations for `f' have different numbers of arguments \path\to\my\program.hs: (1,1)-(2,34) \path\to\my\program.hs: 3:1-6 Failed, modules loaded: none.
我认为它们都有完全相同数量的论点(一个),但GHC似乎不同意,任何人都可以解释我做错了什么吗?
在线尝试!
请注意,函数的分段定义不是一流语法; 它只是表达式的语法糖case
:
f :: Eq a => [a] -> [a] f = \x -> case x of (a:b:xs) | a == b -> f xs | otherwise -> a : f (b:xs) x -> x
这使得更容易理解为什么不能逐段更改参数的数量:编译器无法正确填写case
表达式的最后一行.