問題タブ [lambda]
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# で Action Delegates を使って作業していましたが、それについてもっと学び、どこで役立つかを考えていました。
アクションデリゲートを使用した人はいますか?もしそうなら、それはなぜですか? または、それが役立つ可能性のある例をいくつか挙げていただけますか?
lambda - ラムダとは何ですか? 実装例は何ですか?
私はプログラミングにかなり慣れていないため、このラムダの概念を何度も読んでいるうちに、ラムダが実際に何であるか、それを実装することでプログラミングの生活がどのように改善されるかを理解するのに苦労しています。まず、ラムダとは何か、次にどのように実装されるのでしょうか?
投稿してくれたすべての人に感謝します。コメントで述べたように、これは重複していますが、ここには素晴らしい回答がたくさんあります。コミュニティ用に保存したいので、コミュニティの投稿に変えています。他の質問へのリンクは次のとおりです。
c# - OrderBy 式のリファクタリング
linq 式のOrderBy句をリファクタリングできるようにしたいと考えています。
where句 のリファクタリングの例を次に示します。
前:
後:
Orderby式をリファクタリングしたい以外は、同じタイプのことが可能かどうか疑問に思っていました。
前もって感謝します
haskell - これらの値は、この haskell 関数のどこから来ていますか?
私が次の機能を持っているとしましょう:
の結果はsumAll [(1,1),(2,2),(3,3)]
になります12
。
私が理解していないのは、(x,y)
値がどこから来ているのかということです。ええと、それらが変数から来ていることは知っていますが、そのxs
方法がわかりません。上記のコードを where キーワードなしで直接実行すると、次のようになります。
f
そして、上のコードでは、変数と(x,y)
変数が(\(x,y) -> x+y)
ラムダ式をどのように表しているのか理解できません。
c# - イベントハンドラーのラムダ?
C#3のLambda構文を使用すると、ワンライナーの無名メソッドを作成するのに非常に便利です。これらは、C#2が提供してくれたより言葉の多い匿名デリゲート構文を確実に改善したものです。ただし、ラムダの利便性は、ラムダが提供する関数型プログラミングのセマンティクスを必ずしも必要としない場所でラムダを使用したいという誘惑をもたらします。
たとえば、私のイベントハンドラーは、状態値を設定したり、別の関数を呼び出したり、別のオブジェクトにプロパティを設定したりする単純なワンライナーである(または少なくとも最初は)ことがよくあります。私のクラスにはさらに別の単純な関数がありますか、それともコンストラクターのイベントにラムダを詰め込む必要がありますか?
このシナリオでは、ラムダには明らかな欠点がいくつかあります。
- イベントハンドラーを直接呼び出すことはできません。イベントによってのみトリガーできます。もちろん、これらの単純なイベントハンドラーの場合、直接呼び出す必要がある時間はほとんどありません。
- イベントからハンドラーのフックを解除できません。一方、イベントハンドラーのフックを解除する必要があることはめったにないので、とにかく、これはそれほど問題にはなりません。
述べられた理由のために、これらの2つのことは私をあまり気にしません。そして、ラムダをメンバーデリゲートに格納することで、これらの問題の両方が本当に問題である場合は解決できますが、ラムダを便利に使用し、クラスを乱雑にしないという目的に反することになります。
他に2つのことがありますが、それほど明白ではないかもしれませんが、おそらくもっと問題があると思います。
各ラムダ関数は、それを含むスコープに対してクロージャーを形成します。これは、コンストラクターで以前に作成された一時オブジェクトが、それらへの参照を維持するクロージャのために、必要以上に長く存続することを意味する可能性があります。うまくいけば、コンパイラはラムダが使用しないクロージャからオブジェクトを除外するのに十分賢いですが、私にはわかりません。誰か知っていますか?
幸いなことに、コンストラクターで一時オブジェクトを作成することはあまりないため、これが常に問題になるとは限りません。ただし、私が行ったシナリオと、ラムダの外で簡単にスコープを設定できないシナリオを想像することができます。
- 保守性が低下する可能性があります。ビッグタイム。関数として定義されているイベントハンドラーとラムダとして定義されているイベントハンドラーがある場合、バグの追跡やクラスの理解が難しくなるのではないかと心配しています。その後、イベントハンドラーが拡張された場合は、それらをクラスレベルの関数に移動するか、コンストラクターにクラスの機能を実装するコードが大量に含まれているという事実に対処する必要があります。 。
ですから、他の人、おそらく関数型プログラミング機能を備えた他の言語の経験を持つ人のアドバイスと経験を利用したいと思います。この種のことについて確立されたベストプラクティスはありますか?イベントハンドラーで、またはラムダがその囲んでいるスコープよりも大幅に長生きするその他の場合にラムダを使用することを避けますか?そうでない場合、ラムダの代わりに実際の関数を使用することを決定するしきい値はどれですか?上記の落とし穴のいずれかが誰かを著しく噛んだことがありますか?思いもよらなかった落とし穴はありますか?
c# - Visual Studio 2008 がラムダ式の構文を認識しない
最近、組み込みの変換ツールを使用して、Web アプリケーション プロジェクト (およびいくつかの依存プロジェクト) を .net 2.0 から .net 3.5 にアップグレードしました。MS AJAX 3.5 と 2.0 の外部 MS AJAX ライブラリの使用など、すべてがうまく機能します。
新しい Lambda 式構文を使用しようとしたときに問題が発生しました。コンパイラは、ラムダ式を有効な構文として認識しません。ソリューション内のすべてのプロジェクトで、ターゲット フレームワーク バージョンが 3.5 に設定されています。同じソリューション内のライブラリ プロジェクトでラムダ式を正常に使用することもできました。
これは私にエラーを与えているコードです。特別なことは何もありません。
私が得ている特定のエラーは次のとおりです。
どんな助けでも大歓迎です。私はほとんど運がなかった Google を検索しています。
c# - デリゲート内の変数のスコープ
私は次のことをかなり奇妙に感じました。繰り返しになりますが、私は主に動的言語でクロージャーを使用してきましたが、これは同じ「バグ」の疑いがあるべきではありません。以下は、コンパイラを不幸にします:
それは言います:
「i」という名前のローカル変数をこのスコープで宣言することはできません。これは、「子」スコープで他の何かを示すために既に使用されている「i」に別の意味を与えるためです。
したがって、これは基本的に、デリゲート内で宣言された変数が宣言された関数のスコープを持つことを意味します。私が期待していたものとはまったく異なります。私は関数を呼び出そうとさえしていません。少なくとも Common Lisp には、変数を本当にローカルにしたい場合は、変数に動的な名前を付ける必要があると言う機能があります。これは、リークしないマクロを作成する場合に特に重要ですが、このような場合にも役立ちます。
だから、この問題を回避するために他の人が何をしているのか疑問に思っていますか?
明確にするために、デリゲートで宣言する変数がデリゲートの後に宣言された変数に干渉しないソリューションを探しています。そして、デリゲートの前に宣言された変数を引き続きキャプチャできるようにしたいと考えています。
c# - C#での適切なカリー化
DoSomething
(パラメーターなしの)関数を取り、それを何らかの方法で処理するメソッドが与えられます。以下のスニペットよりも、パラメーターを使用して関数の「オーバーロード」を作成するためのより良い方法はありますか?
c# - プレーンなデリゲートパラメーターとして提供されたときにラムダ式をキャストする必要があるのはなぜですか
System.Windows.Forms.Control.Invoke(Delegateメソッド)メソッドを使用します
なぜこれがコンパイル時エラーを引き起こすのですか?
しかし、これは正常に機能します。
メソッドがプレーンなデリゲートを期待するのはいつですか?
c#-3.0 - C# ラムダ式と遅延評価
ラムダ式の利点の 1 つは、結果が必要な場合にのみ関数を評価する必要があることです。
次の (単純な) 例では、テキスト関数はライターが存在する場合にのみ評価されます。
残念ながら、これによりコードの使用が少し見苦しくなります。次のような定数または変数で呼び出すことはできません
このように呼び出す必要があります:
コンパイラは、渡された定数からパラメーターなしの関数を「推測」できません。C# の将来のバージョンでこれを改善する計画はありますか、それとも何か不足していますか?
アップデート:
私は自分で汚いハックを見つけました:
これで、関数を次のように定義できます。
関数または値の両方で呼び出します。