問題タブ [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 - 関数型プログラミングでは、ファンクターとは何ですか?
関数型プログラミングに関するさまざまな記事を読んでいるときに「Functor」という用語に何度か出くわしましたが、著者は通常、読者がその用語をすでに理解していると想定しています。Web を見回すと、過度に技術的な説明 (ウィキペディアの記事を参照) または信じられないほどあいまいな説明 (このocaml-tutorial Web サイトのファンクターに関するセクションを参照) のいずれかが提供されています。
誰かが親切に用語を定義し、その使用法を説明し、おそらくファンクターがどのように作成され使用されるかの例を提供できますか?
編集:私は用語の背後にある理論に興味がありますが、概念の実装と実用化よりも理論には興味がありません.
編集 2 : いくつかのクロス用語が行われているようです: C++ の関数オブジェクトではなく、関数型プログラミングの Functor を特に参照しています。
c++ - ファンクターはstd::for_eachに渡されたときに値を保持できますか?
この質問に対する最初の回答によると、以下のファンクターはに渡された後も値を保持できるはずですforeach
(例ではコンパイルできなかったためstruct Accumulator
、クラスを作成しました)。
使用例(例に従って)
_cards
として実装されますstd::deque<Card>
。どれだけ長く_cards
てacc.counter
も、完了後はゼロになりfor_each
ます。デバッガーをステップスルーすると、カウンターの増分が表示acc
されますが、値が渡されることと関係がありますか?
c++ - SIMDまたは非SIMD-クロスプラットフォーム
可能な場合はSIMD(SSE、SPUなど)を利用できるように、いくつかの並列化可能な問題のC++クロスプラットフォーム実装を作成する方法についてのアイデアが必要です。また、実行時にSIMDではなくSIMDを切り替えられるようにしたいと考えています。
この問題に取り組むことをどのように提案しますか? (もちろん、考えられるすべてのオプションについて、問題を複数回実装したくありません)
これはC++では非常に簡単な作業ではないかもしれませんが、何かが足りないと思います。これまでのところ、私の考えは次のようになります...クラスcStreamは単一フィールドの配列になります。複数のcStreamを使用して、SoA(Structure of Arrays)を実現できます。次に、いくつかのファンクターを使用して、cStream全体で実行する必要のあるLambda関数を偽造できます。
for_eachは、ストリームの現在のポインターをインクリメントするだけでなく、SIMDを使用する場合と使用しない場合でファンクターの本体をインライン化する役割を果たします。
そのようなもの:
SIMDが有効になっている場合は、一度チェックすると、ループがメインファンクターの周りにあることに注意してください。
c++ - イテレータアダプタを出力するC++ファンクタ
std::for_each
や友人と一緒に使うのに適したファンクタを考える:
std::copy
これを友人と一緒に使用するのに適した出力イテレータに変換する標準的な方法はありますか? (または逆の適応)次のようなもの:
値がイテレータに代入されるたびにファンクターを呼び出します:
または、代わりに:
バックグラウンド:
出力反復子を使用してコレクションを公開するクラスがあります。
これにより、呼び出し元は、特定のコンテナー タイプの使用を強制したり、ロックやその他の内部の詳細をいじったりすることなく、アイテムにアクセスできます。
たとえば、ユニークなアイテムのみを取得するには:
これは、次のことを圧倒します。
また、これらのアイテムをコピーするのではなく、集約できるようにしたいと考えています。(この質問を参照してください)。私が通常次のようなことをする場所:
これで、同じデータ要素に対して 2 つの別々のメソッドを作成できます。1 つは呼び出すメソッド、もう 1 つは呼び出すstd::copy
メソッドstd::for_each
ですが、イテレーターまたはファンクターを使用して、そのようなメソッドを 1 つだけ定義し、呼び出し元がいずれかを渡すことができるようにするとよいでしょう。ファンクターまたはイテレーターを適切なタイプに必要に応じて適応させます。
私が今行っていることは、アグリゲーターを出力イテレーターまたはファンクターとして使用できるように定義することですが、これは望ましくない複雑さにつながります。
c++ - C ++では、コンパイラが関数オブジェクトを「インライン化」するとはどういう意味ですか?
関数オブジェクトに関するウィキペディアの記事では、コンパイラーがそれらを「インライン化」できるため、for_eachとともに使用すると、そのようなオブジェクトにはパフォーマンス上の利点があると述べています。
私は、これがこの文脈で何を意味するのか、または私が言うのが恥ずかしい文脈で、少し曇っています。助けてくれてありがとう!
c++ - ラムダ式の C++ テンプレート ファンクター
この最初の部分は、以下のエリックのコメントによって解決されましたが、水平ルールの後に説明する二次的な問題につながりました。ありがとうエリック!
テンプレート化されたクラスであるファンクターを、ファンクターへの 2 つのパラメーターと共にブースト thread_group クラスの create_thread メソッドに渡そうとしています。ただし、現在のコンパイル エラーを超えることはできないようです。以下のコードで:
ファンクター自体がテンプレート化されているため、私の問題はSigテンプレートに関係している可能性があると考えたため、「タイプ」のtypedefも試しました。
私が得ているエラーは次のとおりです。
事前にたくさんの前文を添えて。
助けてくれてありがとう!
さて、以下のエリックの提案を取り入れてコードを変更しました。次のコードが得られます。
ただし、これにより別のコンパイル エラーが発生します。
void を result_type として定義したようで、 operator() が何かを返すことを期待しています。関数内から result_type を返そうとしましたが、これもエラーが発生しました。何か案は?
c++ - 「関数呼び出し」演算子をオーバーロードするとどのように役立ちますか?
私は最近、C++ で「関数呼び出し」演算子をオーバーロードできることを発見しました。そのためには、2 対の括弧を書かなければならないという奇妙な方法があります。
そして、次のように使用します。
これはいつ役に立ちますか?
c++ - C++: betwen-startups 関連のファンクター リストを作成する
ファンクター(関数ポインター)のリストのようなものを作成します。次に、それらをバイナリ形式でファイルに書き込みます。問題は、ファンクターが単純な関数ポインターであることです。(間違っていたら訂正してください。)しかし、関数のアドレスは実行ごとに異なります。
それで、質問 - 常に関連するファンクターのリストを作成する方法はありますか?
f# - OCamlのファンクタについて説明してくれませんか?
重複の可能性:
関数型プログラミングでは、ファンクターとは何ですか?
私は OCaml についてあまり知りませんが、F# についてはしばらく勉強しており、よく理解しています。
彼らは、F# には OCaml に存在するファンクター モデルが欠けていると言っています。ファンクターが正確に何であるかを理解しようとしましたが、ウィキペディアとチュートリアルはあまり役に立ちませんでした。
その謎を解明していただけませんか?前もって感謝します :)
編集:
私は要点をつかみました。私を助けてくれたすべての人に感謝します。次の正確な複製として質問を閉じることができます:関数型プログラミングでは、ファンクターとは何ですか?
c++ - VisualStudio2010およびstd::function
私はこのコードを持っています:
目的は、無駄なコピーコストラクタ呼び出しを回避する方法で、reference_wrapperによってファンクタオブジェクトを渡すことです。私は次の出力を期待しています:
これは、GCC> = 4.4.0、Visual Studio 2008、およびstd::tr1名前空間をboostに置き換えることでboostで正しく機能します。ExpressBeta2とリリース候補の両方の新しいVisualStudio2010では機能しません。
この新しいC++機能はvs2010でバグがありますか?または、コードに間違いや誤用がありますか?