問題タブ [function-literal]
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.
recursion - *再帰的*関数リテラル/無名関数をサポートする言語は?
最近では、かなりの数の主流言語が関数リテラルをサポートしているようです。無名関数とも呼ばれますが、名前があっても構いません。重要なことは、関数リテラルは、他の場所でまだ定義されていない関数を生成する式であるため、たとえば C では&printf
カウントされないということです。
追加する編集:本物の関数リテラル式がある場合は、それを関数に渡すか、すぐに引数に適用<exp>
できるはずです。.f(<exp>)
<exp>(5)
recursiveである関数リテラルを記述できる言語はどれか知りたいです。ウィキペディアの「匿名再帰」の記事には、プログラミングの例はありません。
再帰的階乗関数を例として使用しましょう。
ここに私が知っているものがあります:
JavaScript / ECMAScript でそれを行うことができます
/li>callee
:を使用する言語では簡単です
letrec
。たとえば、Haskell (これはそれを呼び出しますlet
):let fac x = if x<2 then 1 else fac (x-1) * x in fac
LispとSchemeにも同等のものがあります。のバインディングは
fac
式に対してローカルであるため、式全体が実際には無名関数であることに注意してください。
他にもありますか?
scala - デフォルトの型パラメータ化された関数リテラルクラスパラメータ
これは意図された動作ですか、それともバグですか?次の特性を考慮してください(クラスであっても、関係ありません)。
これは私が期待していたことです:
でも、これ?
scala - 関数リテラルでローカルスコープを意図せずにキャプチャしないようにするにはどうすればよいですか?
Scala の例で質問しますが、命令型と関数型のハイブリッド スタイルを許可する他の言語に影響を与える可能性があります。
以下に短い例を示します ( UPDATED、以下を参照)。
今iterator.filterNot
では怠惰に動作します。これは素晴らしいことです! その結果、返されたイテレータが多くのメモリを消費しないことが期待されます (実際、O(1))。しかし悲しいことに、私たちはひどい間違いを犯してしまいました:filterNot
は遅延しているため、関数literal への参照を保持していますhuge contains _
。
したがって、メソッドは実行中に大量のメモリを必要とし、そのメモリはメソッドの終了直後に解放できると考えていましたが、実際には、返された を忘れるまでメモリはスタックしIterator
ます。
(私はちょうどそのような間違いを犯しました。追跡するのに長い時間がかかりました!ヒープダンプを見ると、そのようなものを見つけることができます...)
この問題を回避するためのベスト プラクティスは何ですか?
唯一の解決策は、スコープの終わりを生き延び、中間変数をキャプチャした関数リテラルを注意深くチェックすることです。非厳密なコレクションを構築してそれを返すことを計画している場合、これは少し厄介です。この問題を回避し、適切なコードを記述できるようにする、Scala 固有またはその他の優れたトリックを考えられる人はいますか?
更新:以下の huynhjl の回答が示すように、私が以前に示した例は愚かでした。それは:
実際、これらの仕組みが少し理解できたので、それほど心配していません。
scala - このようにscalaの関数リテラルを単純化する方法は?
私はscalaが初めてで、指定された整数が奇数かどうかをチェックする関数リテラルを書き込もうとしています。私の最初の試みは:
val isOdd = (x:Int) => (x & 1) == 1
それはうまく機能し、パラメーター x はこの関数リテラル内で 1 回しか現れないため、次のように "_" 表記を使用してさらに単純化したくなります。
val isOdd = ((_:Int) & 1 ) == 1
ただし、今回はコンパイラが不平を言います:
この警告はどういう意味ですか? ((_ :Int) & 1)
コンパイラは、値が得られるビットごとの操作ではなく、新しいオブジェクトとして認識するのはなぜですか? 「_」表記を使用してこの関数リテラルを記述する方法はありますか?
javascript - オブジェクトがオブジェクト リテラルまたはオブジェクト コンストラクター呼び出しを使用して作成されたかどうかを判断する方法は?
より具体的には、特定のオブジェクトがリテラルを使用して作成されたかどうかをどのように判断しますか?
明らかに、上記の 2 つを比較すると、たとえば次のようになります。
... 最初の 2 つのアラートが表示さfalse
れ、最後の 2 つのアラートが表示されます[Object object]
たとえば、これをやりたい場合は次のようにします。
...これを行うにはどうすればよいですか?
オブジェクトがJavascriptのオブジェクトリテラルであるかどうかを判断する方法を調べましたか? 、しかし、それは私の質問には答えません。
scala - 関数リテラルの構文を単純化するためのScalaアンダースコアの使用
私は次のコードを持っています:
私は最後の文を次のように単純化しようとしました:
しかし、通訳は言います:
私はタイプについてより明確にしようとしました:
コンパイラと私はお互いを理解していません:(
よろしくお願いします、
スタン
actionscript-3 - ActionScript 3の関数と関数リテラルの違いは?
ActionScript 3 の次の 2 つの関数定義の違いは何ですか?
と
javascript - Javascript の変数、オブジェクトを null にするより良いアプローチ
私はモバイル用に何かを構築していますが、どうにかしてnullオブジェクト、変数をクリアしてメモリを少し解放したいと考えています。ここに 2 つの簡単な例があります。どちらも私が信じているように匿名関数ですが、どの方法がより適切またはより有効なアプローチですか? 全部間違ってたらごめんなさい。私にはどちらも同じことをしているように見えますが、必要になるまでオブジェクトが作成されないため、最初のものの方が好きです。2 番目のバージョンでは、変数やオブジェクトなどを作成するためのコードがすぐに実行されますが、必要になるまでメインのビルド機能は実行されません。
どの方法がより一般的かを理解しようとしています。私のような初心者は、無名関数の使用法をほとんど誤解していることを知っています。
V1
V2
html またはイベントの後半
javascript - JavaScript オブジェクト リテラル メソッド: 再帰呼び出し
オブジェクトリテラルからメソッドを再帰的に呼び出すことは可能ですか?
例えば:
エラー: 'f' は定義される前に使用されました。
ありがとう。