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
一起应用。
当我阅读有关 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
一起应用。