因此,如果一种语言提供了更高阶的过程,那么我可以让过程返回过程。类似于:
(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
类似的任务可以在不支持高阶过程的语言中完成,方法是定义采用4个参数而不是3个参数的Proc
,并调用此过程来定义ProcA
,如下所示:
(define (Proc a b c x) ( #| method body -- does not return any procedure |# )
(define (ProcA x) (Proc a1 b1 c1 x))
那么为什么高阶过程有这么多模糊的东西呢?我是不是遗漏了什么?
发布于 2009-05-06 19:36:38
这是一个很好的观察,一个返回另一个函数的函数与一个接受两个参数的函数是相同的。这就是所谓的"Currying“。换句话说,从A到B的函数是逻辑蕴含的证明,即A暗示B,或者:
A => B.
正如您所注意到的,如果A暗示B暗示C,那么A和B暗示C,或者:
(A => (B => C)) <==> ((A, B) => C)
但高阶函数不一定是返回另一个函数的函数。高阶函数是以另一个函数作为其参数的函数。这是一个重要的区别,HOFs是非常强大的编程工具。
例如,考虑以下Haskell函数:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : (map f xs)
这个高阶函数接受一个函数f
,并将其应用于列表中的每个元素。在没有HOFs的语言中,你可以使用循环或类似的东西来做这个函数,但是在有HOFs的语言中,你可以通过一个简单的调用为列表中的每个元素调用f
,如下所示:
map f myList
当然,语言中的控制构造允许您近似高阶函数,但具有高阶函数的语言允许您发明自己的控制构造。方案当然是合格的。
发布于 2009-05-06 19:24:01
我不想在这里重述这个论点,但在Why Functional Programming Matters中,John Hughes认为高阶函数是有用的,因为它们提供了更有效的方法来“粘合”程序的各个部分,从而使代码更容易重用。这些示例是用一种不再经常使用的非常古老的语言编写的,但它们仍然很容易理解,并且非常令人信服。阅读John的论文是一个很好的方法,可以详细回答你的问题“为什么高阶程序有这么多模糊的东西”。
发布于 2009-05-06 18:47:47
这更多的是关于心态而不是可行性。它允许您将函数视为一等公民,并根据对函数进行操作的函数来创建其他函数,等等。
显然,你可以用其他语言来做或模拟这一点,但如果它不是一种语法机制,它就会被视为一种添加或黑客攻击。
https://stackoverflow.com/questions/832668
复制相似问题