1

在阅读有关修复时,因为我对在我的代码中使用递归 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)在评估这一行时哪里出错了?

4

1 回答 1

1

您可以将 lambda 的类型读取为:

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

当您将其提供给fix. 返回的值是另一个函数b -> b,然后它立即与5您的示例中的参数一起应用。

于 2016-03-02T15:03:52.083 回答