Go言語クロージャから関数型プログラミングについて語る
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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go では、gorilla/websocket パッケージを使用して WebSocket メッセージを送信できます。具体的な手順: WebSocket 接続を確立します。テキスト メッセージを送信します。 WriteMessage(websocket.TextMessage,[]byte("message")) を呼び出します。バイナリ メッセージを送信します。WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) を呼び出します。

Go では、関数のライフ サイクルには定義、ロード、リンク、初期化、呼び出し、戻り値が含まれます。変数のスコープは関数レベルとブロック レベルに分割されますが、ブロック内の変数はブロック内でのみ表示されます。 。

Go では、正規表現を使用してタイムスタンプを照合できます。ISO8601 タイムスタンプの照合に使用されるような正規表現文字列をコンパイルします。 ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ 。 regexp.MatchString 関数を使用して、文字列が正規表現と一致するかどうかを確認します。

Go と Go 言語は、異なる特性を持つ別個の存在です。 Go (Golang とも呼ばれます) は、同時実行性、高速なコンパイル速度、メモリ管理、およびクロスプラットフォームの利点で知られています。 Go 言語の欠点としては、他の言語に比べてエコシステムが充実していないこと、構文が厳格であること、動的型付けが欠如していることが挙げられます。

メモリ リークは、ファイル、ネットワーク接続、データベース接続などの使用されなくなったリソースを閉じることによって、Go プログラムのメモリを継続的に増加させる可能性があります。弱参照を使用してメモリ リークを防ぎ、強参照されなくなったオブジェクトをガベージ コレクションの対象にします。 go coroutine を使用すると、メモリ リークを避けるために、終了時にコルーチンのスタック メモリが自動的に解放されます。

IDE を使用して Go 関数のドキュメントを表示する: 関数名の上にカーソルを置きます。ホットキーを押します (GoLand: Ctrl+Q; VSCode: GoExtensionPack をインストールした後、F1 キーを押して「Go:ShowDocumentation」を選択します)。

並行関数の単体テストは、同時環境での正しい動作を確認するのに役立つため、非常に重要です。同時実行機能をテストするときは、相互排他、同期、分離などの基本原則を考慮する必要があります。並行機能は、シミュレーション、競合状態のテスト、および結果の検証によって単体テストできます。

Go の関数にマップを渡すと、デフォルトでコピーが作成され、コピーへの変更は元のマップには影響しません。元のマップを変更する必要がある場合は、ポインタを介してそれを渡すことができます。空のマップは技術的には nil ポインターであり、空ではないマップを期待する関数に空のマップを渡すとエラーが発生するため、空のマップは慎重に扱う必要があります。
