在阅读有关修复时,因为我对在我的代码中使用递归 lambdas 感兴趣,所以我遇到了这个特定的代码示例(来自Here):
fix (\rec n -> if n == 0 then 1 else n * rec (n-1)) 5
现在忽略 fix 的类型签名,我觉得那段代码有问题:
修复(a -> a) -> a
的类型是 lambda 的类型是(a -> a) -> a -> a
我确定我读错了这段代码,但我第一次阅读它的方式是“修复应用于两个参数”这是错误的,因为修复只接受一个参数,一个函数(a -> a),一定有我明显遗漏的东西。
然后,我查看了 lambda 的类型和修复的类型,在我看来“等等,不是有很大的不匹配吗?我可以理解,使用 curried 函数,您可以将类型为a -> a -> a
参数不足的函数提供给创建一个新函数,但在这里我正在(a -> a) -> a -> a
向(a -> a) -> a
函数提供数据,似乎我试图让大象通过针孔,将错误的参数提供给修复函数。
我的内部解析器和类型检查器(brain 1.0)在评估这一行时哪里出错了?