Haskell类型和修复递归示例

时间:2016-03-02 14:58:20

标签: haskell recursion lambda

当阅读有关修复因为我对我的代码中有递归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)在评估此行时出错了吗?

1 个答案:

答案 0 :(得分:1)

您可以将lambda的类型读为:

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

这可能会使您在向fix提供时更清楚。返回的值是另一个函数b -> b,然后在您的示例中立即应用参数5