【发布时间】:2013-09-14 00:57:15
【问题描述】:
我一直认为这两个的定义都是以其他函数为参数的函数。我知道每个的领域都不同,但它们的定义特征是什么?
【问题讨论】:
标签: functional-programming definition higher-order-functions combinators
我一直认为这两个的定义都是以其他函数为参数的函数。我知道每个的领域都不同,但它们的定义特征是什么?
【问题讨论】:
标签: functional-programming definition higher-order-functions combinators
好吧,让我试着从他们的不同领域中推导出他们的定义特征;)
首先,在它们通常的上下文中组合子是高阶函数。但事实证明,在谈论这两个术语的差异时,要牢记上下文是一件很重要的事情:
高阶函数
当我们想到高阶函数时,通常提到的第一件事是“哦,它们(也)将至少一个函数作为参数”(想想fold 等)......好像它们是什么正因为如此。哪个-取决于上下文-它们是。
典型上下文:函数式编程、haskell、任何其他(通常是类型化的)函数是一等公民的语言(比如当 LINQ 让 C# 变得更加出色时)
Focus:让调用者指定/自定义这个函数的一些功能
组合器
组合子是一些特殊的函数,原始的甚至不介意它们作为参数给出什么(参数类型通常根本不重要,所以将函数作为参数传递根本不是问题) .那么恒等组合器也可以称为“高阶函数”吗???正式地:不,它不需要需要一个函数作为参数!但是等一下……在哪种情况下你会遇到/使用组合器(如 I、K 等),而不是仅仅“直接”实现所需的功能?回答:嗯,在纯粹的功能环境中!
这不是法律或其他东西,但我真的想不出在突然将指针、哈希表等传递给组合器...再次,您可以这样做,但在这种情况下,确实应该有比使用组合器更好的方法。
因此,基于这种“弱”的常识法则——您只能在纯函数环境中使用组合器——它们本质上是高阶函数。你还有什么可以作为参数传递的? ;)
组合组合器(当然,仅通过应用程序 - 如果你认真对待它)总是会再次提供新的组合器,因此它们也是高阶函数。原始组合子通常只表示您希望在不使用抽象的情况下应用于某些基本行为或操作(考虑 S、K、I、Y 组合子)。但当然,组合子的定义不将它们限制在这个目的!
典型上下文:(无类型)lambda演算,组合逻辑(惊喜)
焦点:(在结构上)将现有的组合子/“构建块”组合成新的东西(例如,使用 Y 组合子将递归“添加”到尚未递归的东西上)
总结
是的,正如您所看到的,它可能更多是上下文/哲学的事情,或者关于您想要表达的内容:我会从不调用 K-combinator(定义:K = \a -> \b -> a) “高阶函数” - 尽管您很可能永远不会看到 K 被函数以外的东西调用,因此“使”它成为高阶函数。
我希望这种回答能回答你的问题 - 形式上它们肯定不相同,但它们的定义特征非常相似 - 我个人认为组合器在其典型中用作高阶函数上下文(通常介于特殊和怪异之间)。
编辑:我已经稍微调整了我的答案——事实证明——个人经历/印象略有“偏见”。 :) 要更好地了解如何正确区分组合子和 HOF,请阅读下面的 cmets!
EDIT2:看看HaskellWiki 也给出了一个与HOF 相距甚远的组合器的技术定义!
【讨论】: