gpt4 book ai didi

haskell - `f x = x` 不等于 `f = id` 吗?

转载 作者:行者123 更新时间:2023-12-02 10:53:10 25 4
gpt4 key购买 nike

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

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

Try it online!

最佳答案

请注意,函数的分段定义不是一流的语法;这只是 syntactic sugar for a case expression :

 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 的最后一行表达。

关于haskell - `f x = x` 不等于 `f = id` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41636387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com