当阅读有关修复因为我对我的代码中有递归lambdas感兴趣时,我遇到了这个特殊的代码示例(来自Here):
fix (\rec n -> if n == 0 then 1 else n * rec (n-1)) 5
现在忽略修复的类型签名我觉得这段代码有问题:
修复的类型是(a -> a) -> a
,而lambda的类型是(a -> a) -> a -> a
我确定我正在读这段代码错了,但我第一次阅读它的方式是“修复已应用两个论点“这是错误的,因为修复只接受一个参数,一个函数(a - > a),必须有一些我显然缺失的东西。
然后我看了一下lambda的类型,以及修复的类型,在我看来“挂起,是不是存在巨大的不匹配?我可以理解,通过curried函数,你可以提供类型{ {1}}没有足够的参数来创建一个新函数,但是在这里我正在向a -> a -> a
函数提供(a -> a) -> a -> a
,似乎我正试图将大象穿过针孔,喂食修复函数的错误参数。
我的内部解析器和类型检查器(大脑1.0)在评估此行时出错了吗?
答案 0 :(得分:1)
您可以将lambda的类型读为:
(b -> b) -> (b -> b)
这可能会使您在向fix
提供时更清楚。返回的值是另一个函数b -> b
,然后在您的示例中立即应用参数5
。