Haskell 本原递归函数

Haskell 本原递归函数,haskell,recursion,functional-programming,fold,Haskell,Recursion,Functional Programming,Fold,在第4.1章中,它指出这种递归模式 h y [] = f y h y (x:xs) = g y x xs (h y xs) 是原始递归,但我不明白为什么 h [] = v h (x:xs) = g x (h xs) 不是根据的原语递归。 hy'的值仍然基于hy中的h(x:xs)=gx(hxs),如果我们让y=xs和y'=x:xs h y [] = f y h y (x:xs) = g y x xs (h y xs) 也就是说,我们可以自由选择f,g,并且h将通过原语递归定义 特别是,我们可

在第4.1章中,它指出这种递归模式

h y [] = f y
h y (x:xs) = g y x xs (h y xs)
是原始递归,但我不明白为什么

h [] = v
h (x:xs) = g x (h xs)
不是根据的原语递归。

hy'
的值仍然基于
hy
中的
h(x:xs)=gx(hxs)
,如果我们让
y=xs
y'=x:xs

h y [] = f y
h y (x:xs) = g y x xs (h y xs)
也就是说,我们可以自由选择
f,g
,并且
h
将通过原语递归定义

特别是,我们可以选择

f = \y -> v
g = \y x xs -> g' x z
其中,
g'
是我们选择的任何其他函数。然后我们得到

h y [] = v
h y (x:xs) = g' x (h y xs)
现在,如果我们让

h' xs = h () xs

我们将
y
参数固定为非实质性值,以便恢复问题中的函数。从学问上讲,
h'
不是作为一般形式的实例直接获得的,因此
h'
在技术上不是通过上面看到的原始递归方案定义的(即,它不是该形式的实例)。有时,我们发现存在许多变量,而不是
y
。。yn
允许我们选择
n=0
并删除
y
,正如我们在本例中所希望的那样。

第4.1章哪里说您的第二个示例不是原始递归的?它从您的第二个示例开始,然后只是对其进行了一些概括(通过添加额外的
y
参数)以获得您的第一个版本。但我看不出有人声称只有你的第一个使用原始递归。@Cactus这种列表上的递归模式被称为原始递归(Kleene,1952)。我想我误解了它的意思。谢谢是的,但这并不意味着只有你的第一个例子被称为原始递归,与你的第二个例子相反(同样,参考你的例子是令人困惑的,因为你把它们的顺序和教程相比…@Cactus教程说“我们将把这种递归模式推广到原始递归”。这意味着原始模式不是原语递归。另一个问题是,为什么这是一种泛化形式?好吧,比较一般模式和所需目标,并尝试实例化参数,使其匹配。根据,我认为一般的方案应该是
hy(x:xs)=gyxs(hyxs)
,但是为什么in把它定义为
hy(x:xs)=gyxs(hyxs)
?@Sid原始递归的第一个定义只考虑自然数作为参数。在处理列表时,它必须扩展。如果我们按照您的建议扩展它,那么
hy(x:xs)
就不能依赖于
x
,这是非常严格的:我们不能访问任何列表元素!