当前位置:  开发笔记 > 编程语言 > 正文

`fx = x`不等于`f = id`吗?

如何解决《`fx=x`不等于`f=id`吗?》经验,为你挑选了1个好方法。

我只是尝试编写一个函数来删除列表中的两个后续相同条目.(只要列表中有两个相同的条目,就应该删除它们.)我想出了以下递归函数,它完全按预期工作.它依赖于模式匹配:

 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似乎不同意,任何人都可以解释我做错了什么吗?

在线尝试!



1> chepner..:

请注意,函数的分段定义不是一流语法; 它只是表达式的语法糖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表达式的最后一行.


好吧,在生成`case`之前,编译器总是可以进行eta扩展.如果先前的方程具有所有参数(即使存在`seq`和函数类型的底部),它应该是语义保留的.不过,这是一个有趣的观点.
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有