Haskell 输入并修复递归示例

Haskell type and fix recursion examples

当我阅读有关 fix 的内容时,因为我对在我的代码中使用递归 lambda 感兴趣,我想到了这个特定的代码示例(来自 Here):

fix (\rec n -> if n == 0 then 1 else n * rec (n-1)) 5

现在忽略 fix 的类型签名,我觉得那段代码有问题:

修复的类型是 (a -> a) -> a 而 lambda 的类型是 (a -> a) -> a -> a 我确定我读这段代码是错误的,但我第一次阅读它的方式是 "fix is applied to two argument" 这是错误的,因为 fix 只接受一个参数,一个函数 (a -> a),肯定有一些我明显遗漏的东西。

然后我查看了 lambda 的类型和修复的类型,在我看来“等一下,是不是有很大的不匹配?我可以理解,使用柯里化函数,你可以提供一个函数输入 a -> a -> a 没有足够的参数来创建一个新函数,但在这里我将 (a -> a) -> a -> a 喂给 (a -> a) -> a 函数,看起来我正试图让大象穿过针孔,向修复函数提供了错误的参数。

我的内部解析器和类型检查器(大脑 1.0)在评估此行时哪里出错了?

您可以将 lambda 的类型读作:

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

这可能会让您更清楚地了解将其提供给 fix 时会发生什么。返回值是另一个函数 b -> b,然后在您的示例中立即将其与参数 5 一起应用。