问题标签 [functor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
functional-programming - 在函数式编程中,什么是函子?
在阅读有关函数式编程的各种文章时,我曾多次遇到过“函子”一词,但作者通常假设读者已经理解了这个词。在网络上环顾四周,要么提供了过于技术性的描述(请参阅Wikipedia 文章),要么提供了非常模糊的描述(请参阅此ocaml-tutorial 网站上的 Functors 部分)。
有人可以定义这个术语,解释它的用途,或者提供一个如何创建和使用 Functor 的例子吗?
编辑:虽然我对这个术语背后的理论感兴趣,但我对理论的兴趣不如对概念的实现和实际使用的兴趣。
编辑2:看起来有一些交叉术语:我特别指的是函数式编程的函子,而不是C++的函数对象。
c++ - 当传递给 std::for_each 时,仿函数可以保留值吗?
根据这个问题的第一个答案,下面的仿函数在被传递给之后应该能够保留一个值foreach
(我无法struct Accumulator
在示例中编译,所以构建了一个类)。
示例用法(根据示例)
_cards
被实现为std::deque<Card>
. 不管_cards
得到多长时间,完成acc.counter
后为零for_each
。但是,当我在调试器中逐步执行时,我可以看到计数器在递增,那么这与acc
按值传递有关吗?
c++ - SIMD 与否 SIMD - 跨平台
我需要一些想法如何以某种方式编写一些可并行化问题的 C++ 跨平台实现,以便我可以利用 SIMD(SSE、SPU 等)(如果可用)。以及我希望能够在运行时在 SIMD 和非 SIMD 之间切换。
你会建议我如何解决这个问题? (当然我不想为所有可能的选项多次实施该问题)
我可以看到这对于 C++ 来说可能不是一件容易的事,但我相信我遗漏了一些东西。到目前为止,我的想法看起来像这样......一个类 cStream 将是单个字段的数组。使用多个 cStreams 我可以实现 SoA(数组结构)。然后使用一些 Functor,我可以伪造需要在整个 cStream 上执行的 Lambda 函数。
其中 for_each 将负责增加流的当前指针,以及使用 SIMD 和不使用 SIMD 内联函子的主体。
像这样:
请注意,如果 SIMD 已启用,则检查一次并且循环围绕主函子。
c++ - 用于输出迭代器适配器的 C++ 函子
给定一个适合std::for_each
和朋友一起使用的函子:
是否有一些标准方法可以将其转换为适合std::copy
和朋友一起使用的输出迭代器?(或相反的改编)类似:
每次将值分配给迭代器时都会调用仿函数:
或者,或者:
背景:
我有一个使用输出迭代器公开集合的类:
这允许调用者访问这些项目,而无需强制他们使用特定的容器类型,也不会弄乱锁定或其他内部细节。
例如,仅获取唯一项目:
这打败了地狱:
现在我还希望能够聚合这些项目,而不是复制它们。(见这个问题)。我通常会做类似的事情:
现在我可以为相同的数据元素创建两个单独的方法,一个调用std::copy
,一个调用,std::for_each
但是如果能够使用迭代器或仿函数定义一个这样的方法,并且让调用者能够传递任何一个,那就太好了函子或迭代器,根据需要调整它们以适应适当的类型。
我现在正在做的是定义聚合器,使其可以用作输出迭代器或仿函数,但这会导致不必要的复杂性。
c++ - 在 C++ 中,编译器“内联”一个函数对象意味着什么?
在关于函数对象的维基百科文章中,它说这些对象在与for_each一起使用时具有性能优势,因为编译器可以“内联”它们。
我对这在这种情况下的确切含义有点模糊......或者我不好意思说的任何情况。谢谢你的帮助!
c++ - lambda 表达式中的 C++ 模板化函子
第一部分已由 Eric 在下面的评论解决,但导致了我在水平规则之后描述的次要问题。谢谢埃里克!
我正在尝试将作为模板类的函子传递给 boost thread_group 类的 create_thread 方法以及函子的两个参数。但是我似乎无法超越我当前的编译错误。使用以下代码:
我还尝试了 typedef-ing 'type' 因为我认为我的问题可能与 Sig 模板有关,因为函子本身是模板化的。
我得到的错误是:
事先有一堆序言。
提前感谢您的帮助!
好的,我已经修改了以下 Eric 建议的代码,生成了以下代码:
但是,这会导致另一个编译错误:
似乎已将 void 定义为 result_type 它现在期望 operator() 返回一些东西。我尝试从函数中返回 result_type ,但这也产生了错误。有任何想法吗?
c++ - 重载“函数调用”运算符有什么用?
我最近发现,在 C++ 中,您可以重载“函数调用”运算符,以一种奇怪的方式,您必须编写两对括号才能这样做:
然后以这种方式使用它:
这什么时候有用?
c++ - C++:创建 betwen-startups 相关函子列表
我创建了类似函子列表(函数指针)的东西。然后我将它们以二进制形式写入文件。问题是,仿函数 - 是一个简单的函数指针。(如果我错了,请纠正我。)但是函数的地址从一个运行到另一个不同。
那么,问题是 - 有没有办法创建始终相关的函子列表?
f# - 你能向我解释一下 OCaml 函子吗?
可能重复:
在函数式编程中,什么是函子?
我对OCaml不太了解,我研究F#有一段时间了,很了解。
他们说 F# 缺少 OCaml 中存在的函子模型。我试图弄清楚函子到底是什么,但维基百科和教程对我帮助不大。
你能帮我解开这个谜吗?提前致谢 :)
编辑:
我已经抓住了重点,感谢所有帮助过我的人。您可以将问题作为完全重复的内容结束:在函数式编程中,什么是函子?
c++ - Visual Studio 2010 和 std::function
我有这个代码:
目的是通过 reference_wrapper 传递函子对象,以避免无用的复制 costructor 调用。我期望以下输出:
它可以与 GCC >= 4.4.0、Visual Studio 2008 以及通过将 std::tr1 命名空间替换为 boost 来正常工作。它仅不适用于新的 Visual Studio 2010 Express Beta 2 和 Release Candidate。
这个新的 C++ 功能在 vs2010 中是否存在错误?还是代码中有一些错误或误用?