問題タブ [implicits]

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.

0 投票する
4 に答える
1119 参照

scala - あいまいな暗示

問題は、次のコードが型推論で機能しないのはなぜですか (以下は、デモ用の REPL セッションです)、修正できるのでしょうか? より具体的には、これは、コンパイラが戻り値の型を推測するために使用する CanBuildFrom の使用とどう違うのでしょうか?

このコードを考えると:

REPL (2.8.1) にこのセッションがあります。

0 投票する
1 に答える
548 参照

generics - Scalaの暗黙的要素は、より種類の多い型を変換するために構成できますか?

LongArrayWritableというタイプがあり、これはLongの配列のボックス化された表現であるとしましょう。これらのタイプ間で変換する暗黙の定義があります。

今、私はjava.lang.Iterableとscala.collection.List[X]の間でそれらの一般的な形式で変換する暗黙的なものも持っています:

これらの定義を使用して、scalaコンパイラーはjava.lang.Iterable[LongArrayWritable]とList[Array [Long]](と同等iterator2list(iterator).map(unboxLongArray(_)))の間の暗黙的な変換を推測できますか、またはこれは暗黙的な機能を超えているため、独自の(明示的?)暗黙的定義?

ありがとう、

ティム

0 投票する
2 に答える
50331 参照

scala - Scala はどこで暗黙を探しますか?

Scala の初心者への暗黙の質問は、次のように思われます: コンパイラはどこで暗黙を探しますか? まるで言葉がないかのように、質問が完全に形成されないように見えるため、暗黙的という意味です。:-) たとえば、integral以下の値はどこから来たのですか?

最初の質問に対する答えを学ぶことを決定した人に続くもう 1 つの質問は、明らかにあいまいな特定の状況で、コンパイラーがどの暗黙のうちに使用するものをどのように選択するのかということです (ただし、とにかくコンパイルします)。

たとえば、から への変換と から への変換の 2つをscala.Predef定義します。しかし、どちらのクラスも多くのメソッドを共有しています。StringWrappedStringStringOpsmap

注:この質問は、より一般的な方法で問題を説明することを期待して、この他の質問に触発されました。例は、回答で参照されているため、そこからコピーされました。

0 投票する
4 に答える
288 参照

scala - Scala の型クラスに関する質問

クラスFruitOrange、およびがあるとしAppleます。

ここで、型とwriteの両方に機能を追加したいと考えています。型クラスパターンを使用すると、次のことができます。OrangeApple

だから、とても良いですが、定義したい場合はどうすればよいwriteFruitsですか?

どちらかまたはfor eachwriteFruitsを呼び出したいと思います。うまくいかないことがわかりました(そしてその理由はわかっています)が、とにかく実装できるかもしれません。write[Apple]write[Orange]fruitwriteFruits

writeFruits何とか実装できますか?

0 投票する
3 に答える
193 参照

oop - 特定の種類のコレクションの操作をどうするか?

Seq[SalesRow]アプリケーションのいくつかの異なる場所で、 を取得してを返す必要がありますMap[String,SalesRow]。ここで、文字列は国の名前です。

これをいくつかの場所で使用する必要があります。たとえば、すべての SalesRows のリストを取得して、国ごとの売上高のグローバルな内訳を取得します。しかし、他の場所では、売上を月ごと、次に国ごとに分類したいと考えています (つまり、 にMap[Month,Seq[SalesRow]]なりますMap[Month,Map[String,Seq[SalesRow]]])。さらに別の場所では、日ごと、次に国ごとに分類したいと考えています。

Seq[SalesRow]私の質問は、国のマップを行に取り、返す(少量の) ロジックをどこに配置すればよいかということです。今、私はそれをコンパニオン オブジェクト メソッドに入れていますSalesRow.byCountry(rows : Seq[SalesReport]。それは最適ですか?

インスタンス メソッドを持つからSeq[SalesRow]への暗黙的な変換を作成するという、少しクレイジーなアイデアが思い浮かびました。この操作は SalesRows の任意のシーケンスに適用できるため、これは私にとって魅力的です。EnhancedSalesRowSeqbyCountry

これは良い考えですか?

コンパニオン オブジェクトにロジックを追加することは私の最良の選択ですか、それともより良いオプションはありますか?

ありがとう。

0 投票する
2 に答える
697 参照

scala - 2 つの一見同一のセマンティクス: 1 つは暗黙的にバインドされ、もう 1 つはバインドされません

こんにちは: 私は最近 Scala を学んでいます (私の関連するバックグラウンドは主に C++ テンプレートです)、Scala について現在理解していないことに出くわし、気が狂いそうになっています。:(

(また、これは StackOverflow への私の最初の投稿であり、本当に素晴らしい Scala の人々のほとんどがたむろしているように見えることに気づいたので、メカニズムでひどくばかげたことをした場合は本当に申し訳ありません。)

私の特定の混乱は、暗黙の引数バインディングに関連しています。暗黙の引数がバインドを拒否する特定のケースを考え出しましたが、一見同一のセマンティクスを持つ関数はバインドを拒否します。

もちろん、これはコンパイラのバグかもしれませんが、私が Scala を使い始めたばかりであることを考えると、何らかの深刻なバグに遭遇する可能性は十分に小さいので、誰かが私の間違いを説明してくれることを期待しています。;P

私はコードを調べて、動作しない単一の例を思い付くためにかなり削りました。残念ながら、問題は一般化でのみ発生するように見えるため、この例はまだかなり複雑です。:(

1) 思ったように動かない単純化されたコード

Scala 2.9.0.1 でコンパイルされたこのコードは、次のエラーを返します。

この場合の私の期待は、runAllへの暗黙のrun引数にバインドされることrunAnyです。

ここで、runAll2 つの引数を直接受け取る代わりに、それらの 2 つの引数を受け取る関数を返すように変更すると (他の人のコードで見たように、試してみようと思ったトリック)、動作します。

2) 同じ実行時の動作を持ち、実際に動作する変更されたコード

本質的に、私の質問は次のとおりです。なぜこれが機能するのですか? ;( 私は、これら 2 つの関数が全体的に同じ型シグネチャを持つことを期待しています。

問題を理解するのに役立つ場合は、他のいくつかの変更も「機能」します (ただし、これらは関数のセマンティクスを変更するため、使用可能なソリューションではありません)。

3) runAllOutput を HNil に置き換えて、第 2 レベルのみをハードコーディングする

4) 暗黙の関数からコンテキスト引数を削除する

これについて誰かが持っているかもしれない説明は大歓迎です。:(

(現在、私の最善の推測では、他の引数に対する暗黙の引数の順序が、私が見逃している重要な要因であるということですが、私が混乱しrunAnyているのは、最後にも暗黙の引数があるため、明らかな「implicit def末尾でうまく機能しないimplicit」は意味がありません。)

0 投票する
1 に答える
331 参照

scala - Scalaz の `F[_] : Applicative` 型制約はどのように暗黙のパラメータの使用を暗示していますか?

TraverseScalaz の traitの次の関数定義を理解するのに苦労しています:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

わからない部分はF[_] : Applicative.

さて、何が何であるか見てみましょうApplicative

ここで、 fortraverseが何らかの type に対して機能するにFは、 type の暗黙的なオブジェクトをApplicative[F]スコープに入れる必要があります。

私はいくつかのことを理解したいです:

  1. どういうF[_] : Applicative意味ですか?
  2. F[_]と関係があるのはなぜApplicativeですか?Applicative[F]F[something] extends Applicative じゃなくて が必要ですよね?
  3. Applicative[F]このメソッドは、暗黙的なパラメーターを宣言せずに型の暗黙的な値を使用するのはなぜですか?
0 投票する
1 に答える
515 参照

scala - DummyImplicit が [String](a: A) から (a: String) を明確にしないのはなぜですか?

次のコードがあるとします。

Scala コンパイラーは、以降の値を見ると、「オーバーロードされた定義へのあいまいな参照」と文句を言います。

行 1: 私の意図は、「属性」を生成するファクトリ「Attr」に値型「文字列」と、それが生成するすべての属性の名前「foo」を渡すことです。

行 2: 以前に構成された属性ファクトリを使用して、実際には「String」型の値「bar」を持つ「foo」という名前の属性を作成しています。

私の結論: このファクトリ オブジェクトのパラメーター化された型 "A" は "String" であるため、Scala コンパイラーはメソッド "apply" の同じパラメーター シグネチャが "(value: String)" であると推測しますが、これはあいまいです。したがって、暗黙のパラメーター リストを追加することで、署名に違いを作ろうとしました。

型消去と DummyImplicitに関する記事を読み、Scala のリファレンス セクション「7.2 Implicit parameters」を参照した後、「(implicit dummy: DummyImplicit)」でうまくいくと思いました

今のところ、私の解決策は最小限のラッパーを持つことです:

「Str To Txt」型の暗黙の値、つまり適切な変換関数が見つかった場合、上記の 2 行目がコンパイルされます。つまり、次のようになります。

複雑に考えすぎていたようです。applyのパラメーター リストでメソッドをオーバーロードする代わりに(value: String)、単純にそれを取り除きました。私の完全な期待に応えるバージョンは、次のようになります。

0 投票する
2 に答える
418 参照

scala - (implicit conv: String => A) をビュー バウンドとして表現する方法

私は、ビューバウンドと同等のものは何であるかを自問しています

A私の最初の試みは、次のように型パラメーターを単純に宣言することでした。

しかし、Scala コンパイラは"not found: type A"と文句を言います。

助言がありますか?

0 投票する
1 に答える
422 参照

scala - Scala: コンテキスト バインドされた List[T] 変換をここで機能させる方法は?

これはここでの最初の質問なので、十分な詳細を提供していただければ幸いです。ご不明な点がございましたらお気軽にお問い合わせください。

次の点を考慮してください。

このコードは、Option でラップされた BSON の断片を別の Option[T] に変換します。リストでも同じことができると思いましたが、以下はコンパイルされません。

一般的なメカニズムには次のコードを使用しています。

コンパイラ エラー: could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

型を提供するために fromBson が呼び出される前に、コンパイラが T を評価しようとしているように見えるので、これは奇妙に思えます。オプションリーダーにはそのような苦情はないように見えるので、これは特に奇妙に思えます。私は最近 Scala で本格的にコードを書き始めたばかりなので、ここで何かが欠けていると確信しています。

さらに情報が必要な場合はお知らせください。お役に立てれば幸いです。

一番、

ダーク