组合子和高阶函数之间有什么区别?

时间:2013-09-14 00:57:15

标签: functional-programming definition higher-order-functions combinators

我一直认为这两个定义都是将其他函数作为参数的函数。我理解每个领域的不同之处,但它们的定义特征是什么?

1 个答案:

答案 0 :(得分:5)

好吧,让我尝试从不同的领域中获得他们的定义特征;)

首先,在其通常的上下文组合器更高阶函数。但事实证明,在谈论这两个术语的差异时,背景是一个重要的事情:

更高阶函数

当我们考虑更高阶函数时,通常提到的第一件事是“哦,他们(也)至少将一个函数作为一个参数”(考虑fold等)......好像他们因为那个是特别的东西。哪个 - 取决于具体情况 - 他们是。

典型上下文:函数式编程,haskell,任何其他(通常是类型化的)语言,其中函数是一等公民(就像LINQ使C#更加出色时)

焦点:让调用者指定/自定义此功能的某些功能

<强>组合子

组合器是一些特殊的函数,原始的甚至不介意它们作为参数给出的内容(参数类型通常根本不重要,所以将函数作为参数传递根本不是问题) 。那么身份组合器也可以称为“高阶函数”???形式上:不,它不是需要一个函数作为参数!但请坚持......在哪种情况下你会遇到/使用组合器(如I,K等)而不是直接“直接”实现所需的功能?答:嗯,在纯粹的功能背景下!

这是法律或其他什么,但我真的不会想到你会在突然将指针,哈希表等传递给上下文的上下文中看到实际组合器的情况。组合......再次,你可以这样做,但在这种情况下,应该有比使用组合器更好的方法。

因此,基于常识的这种“弱”法则 - 您将仅在纯粹的功能环境中使用组合器 - 它们固有是更高阶函数。还有什么可以作为参数传递? ;)

组合组合器(当然,只有应用程序 - 如果你认真对待)总是给出了新的组合器,因此也是高阶函数。原始组合器通常只代表一些基本行为或操作(思考S,K,I,Y组合器),您希望在不使用抽象的情况下应用于某些东西。但是,当然,组合器的定义确实将它们限制在那个目的!

典型背景 :(无类型)lambda演算,组合逻辑(惊讶)

焦点 :(在结构上)将现有的组合器/“构建块”组合成新的东西(例如,使用Y-combinator将“递归”添加到非递归的东西)

<强>摘要

是的,正如你所看到的,它可能更像是一个上下文/哲学的东西,或者你想要表达的内容:我会永远不会调用K-combinator(定义:{{1} })“高阶函数” - 虽然你很可能永远不会看到K = \a -> \b -> a被其他东西调用而不是函数,因此“使它”成为一个更高阶函数。

我希望这种方式可以回答你的问题 - 正式地说它们肯定是相同,但它们的定义特征非常相似 - 我个人认为组合器是用作典型的高阶函数的函数上下文(通常介于特殊和奇怪之间)。

编辑:我已经调整了我的答案 - 因为事实证明 - 它被个人经历/印象略微“偏见”。 :)为了更好地了解正确区分组合器和HOF,请阅读下面的评论!

EDIT2:查看HaskellWiki还给出了远离HOF的组合器的技术定义!