Haskell多态定义

Haskell多态定义,haskell,Haskell,我无法理解fold和foldr之间的区别。 折叠的定义是: fold :: (t->t->t) -> [t] -> t fold f [a] = a fold f (a:b:x)= f a (fold f (b:x)) 其中只有一个类型参数t foldr定义为 foldr :: (t->u->u) -> u -> [t] -> u foldr f s [] = s foldr f s (a:x) = f a (foldr f s

我无法理解
fold
foldr
之间的区别。
折叠的定义是:

fold :: (t->t->t) -> [t] -> t
fold f [a]    = a
fold f (a:b:x)= f a (fold f (b:x))
其中只有一个类型参数
t

foldr
定义为

foldr :: (t->u->u) -> u -> [t] -> u
foldr f s []    = s
foldr f s (a:x) = f a (foldr f s x)
我正在读“函数编程的技巧”,它说,
fold
函数是通过添加额外的参数来修改的,目的是检查空列表。当
fold
函数本身可以被修改以满足所有目的时,为什么需要
foldr
,这是没有道理的

其次,当我尝试书中的以下示例时:

rev :: [t] -> [t]
rev list = foldr stick [] list

stick :: t -> [t] -> [t]
stick a x = x++[a]
并将
foldr
的定义修改为
foldr::(t->t->t)->[t]->t
。Hugs抛出了一个类型为的错误。我试着用谷歌搜索,但找不到满意的答案

因此,我的疑问总结如下:

  • 疑问1:使
    foldr
    类型比fold更通用的原因
  • 疑问2:为什么我会得到一个错误,即无限统一类型
我将从结尾开始:

rev :: [t] -> [t]
rev list = foldr stick [] list

stick :: t -> [t] -> [t]
stick a x = x ++ [a]
如果您使用您给出的
foldr
的定义,则可以正常工作:

foldr :: (t->u->u) -> u -> [t] -> u
foldr f s []    = s
foldr f s (a:x) = f a (foldr f s x)
正如你在这里看到的:

λ> rev [1..5]
[5,4,3,2,1]
如果用您的
折叠定义替换它,则不起作用:

fold :: (t->t->t) -> [t] -> t
不管你怎么称呼它,因为麻烦是从签名开始的

请参阅-当您执行
rev list=fold stick[]list
时,您会这样说

t -> t -> t
应该在某种程度上等于

t' -> [t'] -> [t']
因为第一个是类型
fold
期望它的第一个参数,第二个是由
stick
给出的签名(这里将
t
重命名为
t'
,表示类型应该不同)

现在这意味着
t~t'
t~[t']
t~[t]
这两种类型最有可能是你得到的错误(顺便说一句:
a~b
这里我说的是两种类型
a
b
应该是相等的-如果你愿意的话,想想
=/code>)

这应该会让你的怀疑2有所启发


现在来看第一部分:老实说,我不知道该告诉你什么

使
fold
更通用的原因是它更通用-实际上
foldr
是列表的一个非常特殊的函数-它是(另请参见)

但对于一般函数来说,对列表进行操作是很复杂的


事实上,您只需
foldr
,就可以重写列表中的大量函数(基本上是使用空或cons样式的模式匹配的递归函数),这很可能是您课程的一大部分(我认为您是FP101x的学生,对吧?)在你的书中,这是一个关于高阶函数的例子,它可以统治所有函数;)

听起来像是家庭作业。注意,
fold
在Haskell中不是通用函数,所以你的问题实际上是不完整的。请下次再努力。@PatrickCollins,这在这里一点问题都没有…@Carsten如果OP投入一些重要的工作,那就没问题了。如果你按照你暗示的方式修改
foldr
,你将在GHC(i)上得到
foldr
你的<代码> Rev 定义很好,工作正常,所以你要么跑了另一个拥抱错误,要么错过了一些东西——请考虑使用GHC而不是拥抱,即使你做FP101X课程-如果你有麻烦使用拥抱的“复制和过去到你的RePL得到类型”问题-对于其他人来说,GHC只是一个更明智的选择。我不是FP 101x的学生。我从图书馆拿了这本书,试图学习haskell。@user3274335哦,对不起-只是几乎所有(你是我看到的第一个例外)在最后几天拥抱的人都来自那里-那就搬到GHC吧