因此,如果一种语言提供了更高阶的过程,那么我可以拥有返回过程的过程。就像是:
(define (Proc a b c)
(lambda (x) ( #| method body here in terms of a b c and x |# )))
要创建新程序,我只需执行以下操作:
(define ProcA (Proc a1 b1 c1)) ; Would create ProcA that has 1 argument
类似的任务可以通过定义不支持高阶过程的语言来完成Proc
需要 4 个而不是 3 个参数并调用此过程来定义ProcA
, like:
(define (Proc a b c x) ( #| method body -- does not return any procedure |# )
(define (ProcA x) (Proc a1 b1 c1 x))
那么为什么高阶过程有这么多模糊之处呢?我错过了什么吗?
一个很好的观察是,返回另一个函数的函数与带有两个参数的函数是相同的。这称为“柯里化”。换句话说,从 A 到 B 的函数是逻辑蕴涵的证明,即 A 蕴涵 B,或者:
A => B.
正如您所注意到的,如果 A 暗示 B 暗示 C,则 A 和 B 暗示 C,或者:
(A => (B => C)) <==> ((A, B) => C)
但高阶函数不一定是返回另一个函数的函数。高阶函数是以另一个函数作为参数的函数。这是一个重要的区别,HOF 是非常强大的编程工具。
例如,考虑这个 Haskell 函数:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : (map f xs)
这个高阶函数需要一个函数f
并将其应用于列表中的每个元素。在没有 HOF 的语言中,您可以使用循环或类似的东西来执行此函数所做的操作,但在具有 HOF 的语言中,您可以调用f
对于列表中的每个元素,使用如下简单调用:
map f myList
当然,语言中的控制结构可以让你近似高阶函数,但是具有高阶函数的语言可让您发明自己的控制结构。方案当然符合条件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)