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