需要帮助了解Haskell函数的功能吗

需要帮助了解Haskell函数的功能吗,haskell,functional-programming,Haskell,Functional Programming,不确定这到底是做什么的,或者输入什么到函数中以在输出中找到模式 f0 f id [] = id f0 f id (x:xs) = f x (f0 f id xs) f和id在每次递归调用中都保持不变,所以让我们稍微简化一下: f0 [] = id f0 (x:xs) = f x (f0 xs) 这意味着f0 xs可以扩展到: f x1 (f x2 (f x3 id)) 哪一种看起来像foldr。那是因为它是foldr Prelude> foldr (+) 0 [1, 2, 3] 6

不确定这到底是做什么的,或者输入什么到函数中以在输出中找到模式

f0 f id [] = id

f0 f id (x:xs) = f x (f0 f id xs)

f
id
在每次递归调用中都保持不变,所以让我们稍微简化一下:

f0 [] = id
f0 (x:xs) = f x (f0 xs)
这意味着
f0 xs
可以扩展到:

f x1 (f x2 (f x3 id))
哪一种看起来像foldr。那是因为它是
foldr

Prelude> foldr (+) 0 [1, 2, 3]
6
Prelude> f0 (+) 0 [1, 2, 3]
6

好的。让我们走过去。这是一个递归函数,具有基本情况和递归步骤。它名为
f0
,有三个参数,
f
id
(与前奏曲中的一个函数同名)和
(x:xs)
。不幸的是,它没有类型签名,但我们已经知道第三个是某种列表。因此,它的签名将类似于
f0::a->b->[c]->d

基本情况很简单:如果第三个参数是空列表,则函数返回
id
,因此具有函数返回的类型。因此这两种类型是相同的,我们可以将类型签名细化为
f0::a->b->[c]->b

只有当列表
(x:xs)
不为空时,才会调用递归案例。它调用
f
,因此它必须是两个参数的函数,其中
x
(列表的开头)作为
f
的第一个参数,调用
f0
作为第二个参数。由于
f
的返回值是
f0
的有效返回值,因此它们必须具有相同的返回类型。因此,我们可以推断,如果
b
f0
的返回类型,
[a]
是第三个参数的类型,则此函数的签名必须是:

f0::(a->b->b)->b->[a]->b

现在,让我们仔细看看递归步骤中
f
的第二个参数。它调用
f0f id xs
,这是完全相同的调用,但位于列表的末尾。(因此,列表每一步都会缩短一个元素,直到它为空,我们到达基本情况,因此算法必须终止。)因此,
f0(+)0.0[1,2,3]
扩展到
1+(2+(3+0.0))
。这是前奏曲中的一个功能;你能告诉我是哪个吗


编辑:另一个答案破坏了它,但我要注意的是,这些名称也是提示
f0
f
是函数,
id
是identity元素的缩写(因为预期的模型是将其添加到列表的最后一个元素,然后返回相同的元素,就像添加3+0.0得到浮点数3.0一样),x:xs是递归函数中引用列表参数的常规方法。

为了破译代码,我有时发现利用
数据很有用。SimpleReflect
并运行一些测试

> import Debug.SimpleReflect
> let f0 f id [] = id ; f0 f id (x:xs) = f x (f0 f id xs)
> f0 f a [b,c,d,e]
f b (f c (f d (f e a)))
看起来很熟悉。。。它是foldr吗

> foldr f a [b,c,d,e]
f b (f c (f d (f e a)))

好的,是这样。

最好给出一些上下文。是什么让你问这个问题的?在问之前,你考虑了什么?第一次点击了复习按钮,猜猜是哪个帖子出现了?谢谢你抓住我的打字错误。