2

我一直认为这两个的定义都是以其他函数为参数的函数。我知道每个的领域是不同的,但它们的定义特征是什么?

4

1 回答 1

5

好吧,让我试着从他们的不同领域推导出他们的定义特征;)

首先,在它们通常的上下文中,组合器是高阶函数。但事实证明,在谈论这两个术语的差异时,需要牢记上下文是一件重要的事情:

高阶函数

当我们想到高阶函数时,通常提到的第一件事是“哦,它们(也)将至少一个函数作为参数”(考虑fold等)......就好像它们因此而变得特别。哪个-取决于上下文-它们是。

典型上下文:函数式编程、haskell、函数是一等公民的任何其他(通常是类型化的)语言(比如当 LINQ 让 C# 变得更棒时)

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

组合器

组合子是有些特殊的函数,原始函数甚至不介意它们作为参数给出什么(参数类型通常根本不重要,因此将函数作为参数传递根本不是问题)。那么恒等组合器也可以称为“高阶函数”吗???正式地:不,它不需要函数作为参数!但是等等……在哪种情况下你会遇到/使用组合器(如 I、K 等),而不是仅仅“直接”实现所需的功能?回答:嗯,在纯粹的功能环境中!

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

因此,基于这种“弱”的常识法则——您将仅在纯函数上下文中使用组合器——它们本质上是高阶函数。你还有什么可以作为参数传递的?;)

组合组合器(当然,仅通过应用程序——如果你认真的话)总是会产生新的组合器,因此它们也是高阶函数。原始组合子通常只表示您希望在不使用抽象的情况下应用于某些基本行为或操作(考虑 S、K、I、Y 组合子)。但当然,组合子的定义并不局限于此目的!

典型上下文:(无类型)lambda演算,组合逻辑(惊喜)

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

概括

是的,正如您所看到的,它可能更多是上下文/哲学的事情或您想要表达的内容:我永远不会将 K-combinator(定义:)称为K = \a -> \b -> a“高阶函数”-尽管您很可能永远不会看到K被函数以外的东西调用,因此“使”它成为更高阶的函数。

我希望这种回答能回答你的问题——形式上它们肯定一样,但它们的定义特征非常相似——我个人认为组合子是在其典型上下文中用作高阶函数的函数(通常介于特殊和怪异之间) )。

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

EDIT2:看一下HaskellWiki还给出了与 HOF 相距甚远的组合器的技术定义!

于 2013-09-14T18:57:10.897 回答