1. 数式と関数型プログラミングの関係 # 簡単な例で説明すると、数学には写像 (y=f(x)) という概念がありますが、簡単に言うと関数です。最もよく知られているのは 2 次関数 (放物線 y=a*x*x b*x c) です。
ここで、コーディングでは放物線上の特定の点の値を実装します。a、b、c がパラメータであることがわかります。 、 x が独立変数、 y が従属変数 昔だったらこんな感じで実装するかもしれません(ずっと書いてなかったcの記念にcで書いておきます) )
double getParabola(double a,double b,double c,double x) { return a*x*x+b*x+c; }
質問 1. 放物線が与えられ、x =2、x=3、x=4 を求めます。値は次のアプローチになります。
resultA = getParabola(a,b,c,2) resultB = getParabola(a,b,c,2) resultC = getParabola(a,b,c,2)
これはプログラムの通常のアプローチです。しかし、数学的な観点から見ると、数式思考に一貫性を持たせる方法はあるのでしょうか?以下は私の別の実装です (c の書き方を知っているので、ここでは go を使用して実装しています)。
func getParabola(aa,bb,cc float32){ var a = aa var b = bb var c = cc a := func(x float32) { return a*x*x+b*x+c } return a }
次に、質問 1 についても、解決策は次のとおりです。
parabola := getParabola(a,b,c) resultA := parabola(2) resultB := parabola(3) resultC := parabola(4)
は次のとおりです。関数の値を求めるのと同じではないでしょうか?したがって、数学的関係は関数型プログラミングでよく表現されます。
#2. 関数型プログラミングの特徴は何ですか?また、どのような概念がサポートされていますか?
#関数型プログラミングには 3 つの大きな特徴があります
1. 変数の不変性: 変数に値が割り当てられると、その値を変更することはできません。変更が必要な場合は、コピーしてから変更する必要があります。 Go では、文字列変数に値が割り当てられると、c, c[2]='a' のように変更することはできませんが、明示的に []byte に変換してから変更する必要があります。しかし、それはすでに別の思い出です。 2. 機能的な第一級国民: 関数も変数であり、プログラム内でパラメータや戻り値などとして渡すことができます。この機能は c と go の両方でサポートされる必要があります。
3. 末尾再帰: 再帰の概念はフィボナッチ数列で学びました。再帰が非常に深い場合、スタックが爆発し、パフォーマンスが大幅に低下する可能性があります。末尾再帰最適化技術については、コンパイラがサポートしていれば、再帰ごとにスタックを再利用できます(末尾再帰とは、最後のステップで再帰呼び出しが行われることを意味します。このとき、前回の結果がパラメータとして最後のステップに渡されます)したがって、以前の状態はもう影響を及ぼさないため、スタックを再利用できます)。
関数型プログラミングで一般的に使用される手法1.map&reduce&filtermap は、各入力に対して同じ関数を呼び出して出力を生成するために使用されます。 C の for_each、Hadoop のマップ、Python のマップなど。
reduce は、Python や Hadoop の Reduce など、各入力を前の出力に追加して次の出力を取得するために使用され、
filter は、C の count_if などのフィルター処理に使用されます。 。
2. 再帰
3. パイプライン
関数インスタンスを配列またはリストに入れ、データをアクション リストに渡すと、入力が順番に渡されます。関数が動作し (各関数の出力が別の関数の入力として使用され、データが流れ、計算が固定されることを意味します。嵐の概念に似ています)、最終的に必要な結果が得られます。
4. その他 (今後の検討中)
3. 関数型プログラミングと演算効率関数型プログラミングの最も重要な概念は関数方程式です第一級市民であり、関数と変数は同じです。パラメータ、戻り値などとして使用できます。代入ステートメントの使用は好まれないため、再帰がより頻繁に使用されるため、関数型プログラミングの効率は確実に低下します。 私は最近クロージャを使用しています。クロージャの概念は、環境 (1 つ以上の変数) と関数です。クロージャ式が評価されるたびに、分離が取得されます。結果は、クロージャとは異なります。通常の関数 通常の関数は実行可能なコードであり、入口が決まれば呼び出し位置も決まります。たとえば、上記の放物線の例では、
a:=getParabola(0.2,0.1,0.3) b:=getParabola(0.1,0.1,0.4)
を呼び出すと 2 つの放物線が作成されます。効率が下がると思う理由は、クロージャ自体が変数の作成と破棄を伴う評価と代入のプロセスであるためです。もちろん、実際に性能をテストしたわけではありません。後続のリリースでサーバーの効率が低下した場合は、これを考慮する必要があるかもしれません。
Go 言語の知識について詳しくは、PHP 中国語 Web サイトの
go 言語チュートリアル列に注目してください。
以上がGo言語クロージャから関数型プログラミングについて語るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。