Tyl*_*ies 2 functional-programming combinators definition higher-order-functions
我一直认为这两个定义都是将其他函数作为参数的函数.我理解每个领域都不同,但它们的定义特征是什么?
好吧,让我试着从不同的领域中得出它们的定义特征;)
首先,在它们通常的上下文中,组合器是更高阶的函数.但事实证明,上下文是在谈论这两个词的差别时,要记住一件重要的事情:
高阶函数
当我们想到的高阶函数,通常提到的第一件事就是"哦,他们(也)需要至少一个函数作为参数"(思想fold等)...好像他们是一些特别的东西,因为这一点.哪个 - 取决于具体情况 - 他们是.
典型的环境:函数式编程,Haskell中,其中功能一等公民(比如当LINQ由C#更加真棒)任何其他(一般类型)的语言
焦点:让调用者指定/自定义此功能的某些功能
组合子
组合器有些特殊功能,原始组件甚至不介意它们作为参数给出的内容(参数类型通常根本不重要,因此将函数作为参数传递根本不是问题).那么身份组合器也可以称为"高阶函数"??? 形式上:不,它不需要函数作为参数!但请坚持......在哪种情况下你会遇到/使用组合器(如I,K等)而不是直接"直接"实现所需的功能?答:嗯,在纯粹的功能背景下!
这不是法律或其他什么,但我真的不会想到你会在一个上下文中看到实际组合器的情况,你突然将指针,哈希表等传递给组合器......再次,你可以这样做,但在这种情况下,确实应该有比使用组合器更好的方法.
因此,基于这种常识的"弱"定律 - 您将仅在纯粹的功能上下文中与组合器一起工作 - 它们本身就是更高阶的函数.还有什么可以作为参数传递?;)
组合组合器(当然,仅通过应用 - 如果你认真对待)总是会给出新的组合器,因此也是更高阶的功能.原始组合器通常只代表一些基本行为或操作(思考S,K,I,Y组合器),您希望在不使用抽象的情况下应用于某些东西.但是,组合器的定义当然不会限制它们的目的!
典型背景 :(无类型)lambda演算,组合逻辑(惊喜)
焦点 :(结构上)将现有的组合器/"构建块"组合成新的东西(例如,使用Y-combinator将"递归"添加到非递归的东西)
摘要
是的,正如你所看到的,它可能更像是一个上下文/哲学的东西,或者你想要表达的内容:我永远不会称K-combinator(定义:) K = \a -> \b -> a"更高阶函数" - 尽管你很可能永远不会看到K被其他东西调用而不是函数,因此"使它"成为一个更高阶的函数.
我希望这样回答你的问题 - 形式上它们肯定不一样,但它们的定义特征非常相似 - 我个人认为组合器在其典型的上下文中用作高阶函数的函数(通常介于特殊的奇怪之间).
编辑:我已经调整了我的答案 - 因为事实证明 - 它被个人经历/印象略微"偏见".:)为了更好地了解正确区分组合器和HOF,请阅读下面的评论!
编辑2:看看HaskellWiki还给出了远离HOF的组合器的技术定义!
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |