問題タブ [function-composition]
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.
c++ - C++ / C++11 での関数合成
私は現在、C++ 11 でいくつかの暗号化アルゴリズムをコーディングしていますが、これには多くの関数構成が必要です。私が対処しなければならない構成には2つのタイプがあります。
それ自体で関数を可変回数構成します。数学的には、特定の関数 F について、F^n(x) = (F^{n-1} o F)(x) = F^{n-1}(F(x)) です。
さまざまな機能を一緒に構成します。たとえば、同じタイプのいくつかの関数 f、g、h、i、j および k の場合、f(g(h(i(j(k(x)))))) があります。
私の場合、次の F の定義を使用しています。
この関数をそれ自体でn回構成したいと思います。私は正常に動作している単純な再帰的な方法で構成を実装しました:
この場合、 c++11を使用して BOOST を使用せずにこのコンポジションを実装するためのより効率的な方法はありますか? もちろん可能であれば、このフォームを使用することは素晴らしいことです:
2 番目のケースでは、可変数の関数の構成を実装したいと考えています。F と同じ定義を持つ関数 F0、F1、...、Fn の特定のセットについて、n が変数である場合にそれらを構成する効率的で適切な方法はありますか? ここでは可変個引数テンプレートが役立つと思いますが、その場合の使用方法がわかりません。
ご協力いただきありがとうございます。
r - リストに「構成済み」関数を適用する方法
データ フレームのすべての列に「構成済み」関数を適用したいと考えています。
たとえば、sum(is.na) です。しかし:
エラーを返します。
もちろん、次のような「単純な」関数が機能します。
では、「関数の関数」をどのように適用できますか?
特に、私が念頭に置いている合成関数は
データ フレーム内の列と同じ数のグラフィックスが生成されます。
ocaml - OCamlでの一般的な統合関数の書き方
特定の関数の定積分を計算する OCaml の関数を書きたいと思います。問題は、次の構文を目指していることです。
問題は、台形規則のような規則を使用して、次のように記述する必要があることです。
f aと が部分的に適用される機能でf bはないことが期待されます。
最後のintegral関数呼び出しの結果が浮動小数点数を返すとは思っていません。機能的にはまったく問題ありません。
質問が非常に具体的でないことに気づきました。より一般的な方法で言い直します。
私は関数float->float->floatを適用した後にintegral私に与えるべき関数を持っていますfloat->float。これは一般的なものでなければならないので、integralのfloat->float結果は になりfloatます。
問題は、同じ順序の 2 つの関数を減算する必要があるf(a) -. f(b)ことfloat->float->floatです。float->floatfloat->float->float
関数の順序を減らすには、次のような署名が必要です(float->'a->float) -> ('a->float)。
これは可能ですか?特にOCamlでは?
連鎖可能な積分を計算する関数が1 つあるというこの問題について考えれば考えるほど、それを行うのは不可能なタスク/愚かな方法のように思えます。
実際、私はこれを実装しましたが、独自のデータ型 ( 、、、と呼ばfunction_typeれる) を使用しています。しかし、ポリモーフィズムのおかげで、 function に積分を 3 回適用しようとしても、コンパイラは警告を表示できません。Scalar3rdOrderFunctionScalar2ndOrderFunctionScalar1stOrderFunctionScalar0thOrderFunctionfloat->float->float
scala - 高階関数の型定義と型の不一致
私は現在、Martin Odersky の Coursera クラス、Functional Programming Principles in Scala のビデオ講義に取り組んでいます。講義 2.1 では、基底関数 を使用した高階関数の構成を示していますsum()。彼は末尾再帰なしで階乗を実装しましたが、私は末尾再帰を使ってみました。これはまだ 1 行のコードだからです。その結果、Odersky ではなかったと思われる型の不一致が発生しました。の定義sum()では、パラメータfは を受け取り、Intを返しますInt。関数*を調整することでこれを回避できることはわかっていますが、これにより、一般的に高階関数を設計する方法について疑問が生じます。 柔軟な数の引数を取る関数を許可するために、この型定義を調整または回避する方法はありますか? 誰かが Haskell を少し見せてくれたことがあるのですが、Scala の関数パラメーターを同様に緩い方法で型付けできるかどうか疑問に思っています... あるいは、Scala によりネイティブな別の解決策があるかもしれません。私は昨日 Scala を使い始めたばかりで、コンピューター サイエンスの知識が限られていると仮定してください。まさにその通りです。
fact()*次のように、現在の関数を別の関数内にネストすることで、これを修正できることを知っています。
前述の Haskell での経験からの私の印象は、関数型プログラミングは、カリー化を可能にするために引数を 1 つだけ取る関数を促進するというものでした。とにかく、それは実際の質問とは少し関係がありますが、私の質問の精神で FP を恐ろしく解体しているだけなら、コメントで気軽にこれに対処してください。
haskell - Haskell の逆関数合成
次の Haskell コードを検討してください。
JavaScript では、これは次のように記述されます。
ご覧のとおり、関数の合成は、JavaScript のメソッドの連鎖に非常に似ています。メソッドのチェーンが左から右に読み取られる方法が非常に気に入っています。Haskell では、次のように>>>function fromControl.Arrowと reverse function application を使用して同様のことを行うことができます。
この関数をポイントフリースタイルで書きたいと思います。関数合成を使用して、次のように記述します。
ただし、次のように逆関数合成を使用して、この関数をポイントフリースタイルで記述したいと思います。
私の不満は:.、逆の関数構成ではなく、関数構成の観点から関数を定義する必要があることです。あれは:
もちろん(>>>) (>>>) (>>>)型違いです。それは私が探している機能ではありません。
関数合成の優れた点は、上で示したように、それ自体で合成して「高次関数合成」を形成できることです。したがって、その型シグネチャは直観的に後方ですが、実際には前方f . g = \x -> f (g x)ですf . g = \x -> g (f x)。
これは私の実際の質問につながります.対応する「高次関数合成」の>>>代わりに、逆関数合成(つまり)の観点から「高次逆関数合成」を定義する方法はありますか?flip
圏論または数学の他の分野に根ざした答えを探しています。
haskell - (f .) とはどういう意味ですか? g Haskellで意味?
多くの関数が pattern に従って定義されているのを見てきました(f .) . g。例えば:
これは何を意味するのでしょうか?
scala - 「andThen」を理解する
に出くわしましandThenたが、よくわかりませんでした。
さらに詳しく調べるために、Function1.andThenドキュメントを読みました
mmMultiMapインスタンスです。
andThen強力ですか?この例に基づくと、mm.andThen脱糖のように見えx => mm.apply(x)ます。にもっと深い意味があるとすればandThen、私はまだそれを理解していません。