Haskell类型和修复递归示例

Haskell类型和修复递归示例,haskell,recursion,fixpoint-combinators,Haskell,Recursion,Fixpoint Combinators,在阅读关于fix的文章时,因为我对在代码中使用递归lambda感兴趣,所以我遇到了这个特定的代码示例(来自: 现在忽略fix的类型签名,我觉得这段代码有问题: 修复程序的类型是(a->a)->a,而lambda的类型是(a->a)->a->a,我肯定我读错了这段代码,但我第一次读它的方式是“修复程序应用于两个参数”,这是错误的,因为修复程序只接受一个参数,一个函数(a->a),肯定有我明显缺少的东西 然后我看了一下lambda的类型和fix的类型,在我看来“等等,不是有很大的不匹配吗?我可以理解

在阅读关于fix的文章时,因为我对在代码中使用递归lambda感兴趣,所以我遇到了这个特定的代码示例(来自:

现在忽略fix的类型签名,我觉得这段代码有问题:

修复程序的类型是
(a->a)->a
,而lambda的类型是
(a->a)->a->a
,我肯定我读错了这段代码,但我第一次读它的方式是“修复程序应用于两个参数”,这是错误的,因为修复程序只接受一个参数,一个函数(a->a),肯定有我明显缺少的东西

然后我看了一下lambda的类型和fix的类型,在我看来“等等,不是有很大的不匹配吗?我可以理解,使用curry函数,你可以为
a->a->a
类型的函数提供足够的参数来创建一个新函数,但是这里我将
(a->a)->a
提供给
(a->a)->a
函数,似乎我试图让大象穿过针孔,将错误的参数输入到fix函数


我的内部解析器和类型检查器(brain 1.0)在计算这一行时哪里出错了?

您可以将lambda的类型理解为:

(b -> b) -> (b -> b)

这可能会更清楚地说明当您将它提供给
fix
时会发生什么。返回值是另一个函数
b->b
,然后它会立即与示例中的参数
5
一起应用。

我想您是在假设,因为两种类型中的类型变量都被称为
a
,所以它必须是相同的类型如果你有一个函数
fix:(a->a)->a
你真正拥有的是所有a的
(a->a)->a
。这里
a
可以被实例化为任何类型。在这种情况下,你有
a~(x->x)
所以
fix:((x->x)->(x->x))->x
接受两个参数。
(b -> b) -> (b -> b)