問題タブ [for-comprehension]
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.
scala - Scalaの無限ストリームでのネストされた反復
理解のためにScalaの無限ストリームに対してネストされた反復を実行したい場合がありますが、ループの終了条件を指定するのは少し難しい場合があります。このようなことをするためのより良い方法はありますか?
私が念頭に置いているユースケースは、反復している無限のストリームのそれぞれから必要な要素の数を前もって必ずしも知らない場合です(ただし、明らかに、無限の数にはならないことはわかっています)。各ストリームの終了条件は、for式の他の要素の値に複雑な方法で依存する可能性があると想定します。
最初の考えは、 for式のifフィルター句としてストリーム終了条件を書き込もうとすることですが、最初の無限ストリームの反復を短絡する方法がないため、ネストされた無限ストリームをループするときに問題が発生します。これは最終的にOutOfMemoryErrorにつながります。式がmaptomap、flatMap、withFilterメソッドを呼び出す方法を考えると、これが当てはまる理由を理解しています-私の質問は、この種のことを行うためのより良いイディオムがあるかどうかです(おそらく理解にはまったく関係しません)。
今説明した問題を説明するためにやや不自然な例を示すために、次の(非常に単純な)コードを検討して、番号1と2のすべてのペアを生成します。
明らかに、この単純な例では、次のように、 ifフィルターを元のストリームのtakeWhileメソッド呼び出しに移動することで、問題を簡単に回避できます。
しかし、質問の目的のために、ストリームの終了条件をストリーム式自体に簡単に移動できない、より複雑なユースケースを想像してみてください。
scala - for内包内で暗黙のvalを宣言する方法はありますか?
次のように、flatMap へのネストされた呼び出しを含むコードがいくつかあります。
通常、これを for 内包表記として記述し、コードをより読みやすくします。
しかし、私f
は暗黙的である必要があり、理解のためにそれを行う方法がわかりません。ある?もちろん、明示的に f を渡すこともできますが、それはさようならかなり DSL を意味します。Scala 2.9 と 2.10 の両方の回答に興味があります。
明確にするために、私はこのようなことをしたいのですが、コンパイルされません:
編集:多分機能要求は良い考えでしょうか?
EDIT2:これは、 for 内包表記で使用できるすべての型で機能するはずです。そのため、List
orSeq
のような通常のコレクション型だけでなく、Future
.
scala - Scala for-comprehensions の val のスコープ規則は何ですか?
for-comprehension で val を使用すると、次の警告が表示されます。
警告: 内包表記の val キーワードは非推奨です
仕様の構文付録での生産にもかかわらず。
これは、私が次のようなことをするときに
次のようなことをする場合など、変数を実際に導入しているわけではありません
ここで、いつものように、ブレースは新しいスコープを開始し、そこで新しい val または新しい Implicit を導入できます。
私は本当にそれで何をしているのa
ですか?
スタックスペースを消費していますか? ヒープ?別の別名?
scala - 理解のための Scala の背後にあるインデックス可能なデータ構造
Martin Odersky による Coursera での Scala に関する講義の第 6 週を見終わったところです。講義 5 で、彼は次のように述べています。
「... forの翻訳は、リストやシーケンス、さらにはコレクションに限定されません。
メソッドmap、flatMap、および withFilterの存在のみに基づいています。
これにより、独自の型にも for 構文を使用できます。これらの型には、map、flatMap、および withFilter のみを定義する必要があります。"
私が解決しようとしている問題は、いくつかのデータベースからデータをロードし、データを結合して何らかの方法で結果をエクスポートするバッチ プロセスがあることです。データはメモリに収まるほど小さい (各ソース システムから 100,000 レコード程度) が、パフォーマンスを考慮することが重要なほど大きい。
従来のインメモリ データベース (H2 など) を使用して、ScalaQuery などを介してアクセスすることもできますが、実際に必要なのは、さまざまなソース システムからのデータを効率的に検索して結合できる方法だけです。これは、SQL のインデックスと同等です。およびJOIN。Scala 固有のデータ構造によって簡単かつ効率的に解決できるものに、本格的なリレーショナル データベース + Scala ORM を使用するのは、非常に厄介です。
私の最初の素朴なアプローチは、(データベース システムのように B ツリーとして実装できる) 1 つ以上の "インデックス" と組み合わせた (高速な直接アクセスのための) ベクター データ構造です。この結合されたデータ構造のmap、flatMap、withFilterメソッドは、クエリされたフィールドにインデックスがある場合、インデックスを使用するのに十分なほどインテリジェントである可能性があります。または、インデックスを使用するための「ヒント」がある可能性があります。
そのようなデータ構造がすでに存在して利用可能かどうか、または自分で実装する必要があるかどうか疑問に思っていましたか? この問題を解決する Scala のライブラリまたはコレクション フレームワークはありますか?
scala - Scala for-comprehensions の Future[Option]
Futures を返す関数が 2 つあります。for-yield 内包表記を使用して、最初の関数から変更された結果を別の関数にフィードしようとしています。
このアプローチは機能します:
ただし、「if」が含まれていることに満足していません。代わりにマップを使用できるようにする必要があるようです。
しかし、地図を試してみると:
コンパイル エラーが発生します。
いくつかのバリエーションで遊んでみましたが、機能する魅力的なものは見つかりませんでした. 誰かがより良い理解を提案したり、私の2番目の例の何が問題なのかを説明したりできますか?
以下は、Scala 2.10 で最小限だが完全に実行可能な例です。
scala - Scala の for-comprehension (アイデンティティ マップ) の最適化
map(identity)
Scala内包表記を避けるにはどうすればよいfor
ですか?
たとえば、次のことを考慮してください。
IIUC、理解は次のfor
ようなものに変換されます
map(identity)
何らかの方法で末尾を回避できますか? それとも、Scala はそれを最適化できますか? map
(副作用があるかどうかは不明なので、できないと思いますよね?)
PS この特定の例では、物事を改善できることを知っています。たとえば、未来を返す関数Future { value * 2}
の呼び出しである一般的なケースについて疑問に思っています。f(value)
f
scala - 共変/反変型パラメータを持つクラスの flatMap を定義する方法は?
共変と反変の型パラメーターを持つクラスがあるとします。
そして、このクラスのインスタンスに対して定義されたモナド操作があります。
for
-comprehensionを使用できるようにするにflatMap
は、それがトレイト自体のメソッドである必要があります。
ただし、これはコンパイルされず、失敗します
反変型は、値の
I
型の共変位置にあります。(R) => Pipe[I,O,R1]
f
(共変型パラメータでも同様のエラーが発生します。)
制限と問題が発生する理由を理解しています。しかし、上記と同じセマンティクスflatMap
を使用して特性を定義する方法はありますか? Pipes.flatMap
おそらく、いくつかの暗黙的な変換や中間ビルダー クラスを使用していますか?
list - Can't get flatten of 理解するために試してみてください
これは文体に関する質問と、Scala の理解を深めるための私の試みの組み合わせです。
Future を含むリストを取得しました。Future の値を計算し、Option に変換し、for 内包表記を使用してリストを平坦化します。
私がやりたいのは、フラット化されたステージを理解することです。誰か提案はありますか?
coffeescript - coffeescript 内包を通じてコールバックから結果を収集することは可能ですか?
オブジェクトの配列があり、それぞれに非同期readValue
関数があり、コールバックをパラメーターとして受け入れ、このオブジェクトの値が利用可能になったときに起動されるとします。
私の目標は、各オブジェクトのすべての値を計算し、それらの値を含む配列を返すことです。
最初に頭に浮かんだのはこれ
メソッドは非同期であるためreadValue
、それを呼び出す関数も非同期です。すべての値がresult
配列になると、callback
関数が実行されます。
しかし、これはすべて面倒に思えます。これは、coffeescript が本当に強力な領域です。内包表記が少ないコードでもこの関数を書くことは可能ですか? 同期であればOKです。