首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么选择更高阶的过程?

为什么选择更高阶的过程?
EN

Stack Overflow用户
提问于 2009-05-07 02:44:38
回答 8查看 1.5K关注 0票数 5

因此,如果一种语言提供了更高阶的过程,那么我可以让过程返回过程。类似于:

代码语言:javascript
复制
(define (Proc a b c)
  (lambda (x) ( #| method body here in terms of a b c and x |# )))

要创建新的过程,我只需执行以下操作:

代码语言:javascript
复制
(define ProcA (Proc a1 b1 c1)) ; Would create ProcA that has 1 argument

类似的任务可以在不支持高阶过程的语言中完成,方法是定义采用4个参数而不是3个参数的Proc,并调用此过程来定义ProcA,如下所示:

代码语言:javascript
复制
(define (Proc a b c x) ( #| method body -- does not return any procedure |# )
(define (ProcA x) (Proc a1 b1 c1 x))

那么为什么高阶过程有这么多模糊的东西呢?我是不是遗漏了什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-05-07 03:36:38

这是一个很好的观察,一个返回另一个函数的函数与一个接受两个参数的函数是相同的。这就是所谓的"Currying“。换句话说,从A到B的函数是逻辑蕴含的证明,即A暗示B,或者:

代码语言:javascript
复制
A => B.

正如您所注意到的,如果A暗示B暗示C,那么A和B暗示C,或者:

代码语言:javascript
复制
(A => (B => C)) <==> ((A, B) => C)

但高阶函数不一定是返回另一个函数的函数。高阶函数是以另一个函数作为其参数的函数。这是一个重要的区别,HOFs是非常强大的编程工具。

例如,考虑以下Haskell函数:

代码语言:javascript
复制
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : (map f xs)

这个高阶函数接受一个函数f,并将其应用于列表中的每个元素。在没有HOFs的语言中,你可以使用循环或类似的东西来做这个函数,但是在有HOFs的语言中,你可以通过一个简单的调用为列表中的每个元素调用f,如下所示:

代码语言:javascript
复制
map f myList

当然,语言中的控制构造允许您近似高阶函数,但具有高阶函数的语言允许您发明自己的控制构造。方案当然是合格的。

票数 10
EN

Stack Overflow用户

发布于 2009-05-07 03:24:01

我不想在这里重述这个论点,但在Why Functional Programming Matters中,John Hughes认为高阶函数是有用的,因为它们提供了更有效的方法来“粘合”程序的各个部分,从而使代码更容易重用。这些示例是用一种不再经常使用的非常古老的语言编写的,但它们仍然很容易理解,并且非常令人信服。阅读John的论文是一个很好的方法,可以详细回答你的问题“为什么高阶程序有这么多模糊的东西”。

票数 3
EN

Stack Overflow用户

发布于 2009-05-07 02:47:47

这更多的是关于心态而不是可行性。它允许您将函数视为一等公民,并根据对函数进行操作的函数来创建其他函数,等等。

显然,你可以用其他语言来做或模拟这一点,但如果它不是一种语法机制,它就会被视为一种添加或黑客攻击。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/832668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档