問題タブ [shapeless]

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 投票する
0 に答える
352 参照

scala - Scala HList操作:柔軟な構造は可能ですか?

私が何とかできないことの最小の例を書きました。私は間違った方法ですか?

HList 型を保持するオブジェクト Bar があります。以前の HList から新しい HList を構築できる型を持つオブジェクト Foo があります。Foo の子クラスである FooI で、この Hlist が構成されていることを宣言します。形状のない FilterNot を使用して Bar を作成し、それを更新して、型をテストすると、次の結果が得られます。

私が持っていた場合、それはコンパイルされることに注意してください

(そしてバー オブジェクトはインスタンス化され、それに応じてテストされます)

[追加]

型宣言なしで値のみを使用して別のバージョンを試しました。より構造化されているように見えますが、それ以上は機能していません。また、 shapeless.HList.toString は NoSuchMethodException を返しますが、これはまだ私にとって謎です...

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

scala - Nothing の重複する暗黙を見つけないように Scala を騙す方法

私は Scala で typeclass パターンを使用して、有効な API シリアライズ可能なすべての型をマークしようとしています。これにより、シリアライズするものに関してコンパイル時の安全性を確保できます。基礎となるライブラリは、AnyRefシリアル化する前に型を明示的に宣言しないと、奇妙なエラーを引き起こす可能性がある を受け入れます。

公開モデル、公開モデルのイテラブル、公開モデルのオプション、またはユニットを送信できます。

このメソッドは、パラメーターの型がオプションであるメソッドを除いて、すべてに適しています。これは、Noneが であるためです。これは、コンパイラに型の暗黙的なオブジェクトを検索するように指示し、Option[Nothing]両方を見つけるだけでなく、T = NothingSafeForPublic[Nothing]SafeForPublic[PublicModel]SafeForPublic[Iterable[PublicModel]]

の重複する暗黙を見つけないようにコンパイラをだます方法を考えてNothingください。Miles Sabin が次のようなトリックを使っているのを見ました。

しかし、私はそれを使用する方法を理解できませんでした。ハーフ?

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

scala - ネストされたポリモーフィック値でジェネリック型パラメーターを囲む使用方法

TypeTags を使用せずに多態性関数のみを使用して、次の例を書き直すことは可能ですか? この例は、同じ型パラメーターを持つ のインスタンスに適用され、この型パラメーターが異なる値を持つ場合に戻るA[T]メソッドを持つクラスで構成されています。次に、 の各項目を他の項目と照合した結果を含む入れ子になった hlist の hlist を生成する 2 回の hlistにマップされます。matchestrueATfalsematcheslA[T]l

各項目には 1 つの一致があります。つまり、結果は次のようになります。

TypeTagsmatchesを使用せずに例を書き直そうとすると、常にno大文字と小文字が区別され、false が返されます。

結果は次のとおりです。

TypeTags なしでこの例を書き直して、最初のケースと同じ結果を得ることは可能ですか?

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

scala - Shapeless Extensible Record を関数に渡す (続き)

この質問 : Passing a Shapeless Extensible Record to a Function を考慮すると、Travis の回答は、拡張可能なレコードをパラメーターとして受け取るすべての関数には、パラメーターとして暗黙のセレクターが必要であることを示しています。この種の関数がたくさんある場合、それらの宣言を因数分解できるのではないかと思います。例:

ありがとう

ブノワ

12月10日編集

答えのコードを試すと、次の 2 つの問題が発生します。

  1. foo1、foo2、foo3 に関連付けられたデータの実際の型については何も通知されません。したがって、 fun1 のような関数は、これらの型に関連付けられたメソッドを使用できません。たとえば、foo3 が Double であっても、その平方根を取ることはできません。
  2. fun1 を ("foo1"->> "hello") :: ("foo2" -> 1)::("foo3" ->> 1.2)::HNiL で呼び出すと、結果は (hello, 1, 1.2 ) with type (selectors.s1.Out, selectors.s2.Out, selectors.s3.Out) 最後の値 (1.2) に 1 を追加しようとすると、Scala は Int とセレクターを追加できないと文句を言います。 s3.Out ;しかし、私が書いた場合:

    私は書くことができます:

    scala は True と答えます。

この方法でコードを変更しようとしましたが、型が伝播されることを回避しましたが、問題は解決しません。(foo1->> "hello") :: (foo2 -> 1)::(foo3 ->> 1.2)::HNil をパラメーターとして使用して fun1 を呼び出すことさえできません:

上達する方法はありますか?

ブノワ

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

scala - HList を関数の引数として使用する

関数パラメーターとして HList を渡すことは可能ですか?

これは私がこれまでに持っているものです:

このエラーにつながります:

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

scala - poly 関数の型消去、scala

だから私は を介し​​てマップ関数を作成したかったのHListですが、適用関数内のいくつかの条件を確認する必要があります。次のようなものです:

その結果、要素に関するすべての情報typeが失われます。t.headところで、「クリーン」関数を作成する場合:

その後、明らかに、それはすべて大丈夫です。

問題は、それをどのように処理し、そのような機能を作成するか (可能であれば)、または別の方法を検索する必要があるかどうかです。なぜここでタイプ消去ができるのですか?