問題タブ [hlist]

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

scala - shapeless を用いた多形写像関数

私はこれをタイプセーフな方法で機能させようとしています:

これまでのところ、シェイプレス以外にこれをタイプセーフにする別の方法は見つかりませんでした。

私は slick やその他の ORM について知っています。

HList は、異種のオブジェクトの束を渡し、特定の型の値のリストを取得する方法のようです。

私はこのようなことをしようとしました:

重要なことを繰り返します。

HList/Shapeless は問題を解決するための候補となる可能性がありますが、この演習の目標ではありません。私の目標は、関数の戻り値の型を、渡された変数の型とパラメーターの数に対応させることです。

私の小さなユーティリティのユーザーが HList について知る必要がなければ理想的ですが、それは実際の要件ではありません。

重要な部分は、結果のタイプを params のタイプと一致させることです。

より正確には、上記のパラメータのペイロード タイプです。つまり、 res のタイプは T(String, Integer, ....) になります。


別の説明を追加させてください。任意のアリティのメソッドを作成し、パラメーターの数ごとに関数を作成することを避けたいと考えています。22 個のメソッドで問題がなければ、次のようになります。

そして、可能なすべてのタプルが明示的に定義されるため、 shapeless または HList は必要ありません。

これら 3 つの署名を実際に見てみましょう - それらを 22 にするのは少し時間がかかりますが、形のない依存関係を回避し、実装もワンライナーになります。30 分かけて手動で (または小さなスクリプトを使用して) 実行する必要があるかもしれません。

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

haskell - トップレベルのパターンをモノモーフィックにする

希望qroto :: (Char, [Char])の が得られますが、proto :: (t, t1)一般的すぎます。さらに重要なことに、これはpx :: (Char, t)代わりにqx :: (Char, [Char]).

より大きな問題は、 Data.HList.Variant.mkVariantの 3 番目の引数で必要な型注釈を削減できるようにしようとしていることです。

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

haskell - Haskellでファントム型のタプルを連結する方法は?

SQLフラグメントをモノイドとして構成できるSQLコンビネーターを書いています。私はおおよそこのようなタイプを持っています(これは単純化された実装です):

これにより、頻繁に使用する SQL のビットを簡単に組み合わせて、次のようなことを行うことができます。

それは非常にうまく機能し、私はそれに満足しています。今、私は and を使用MySQL.Simpleして実行するには、行のタイプを知る必要があります。

それが私が必要な理由です

この明示的な (そして役に立たない) 型シグネチャを手動で追加することを避けるために、私は次のアイデアを思いつきました: ファントム型を my に追加し、SQLFragmentそれを使用して関数の型を強制query_します。だから私はこのようなものを持つことができました

など...

それから私はすることができます

私の最初の問題は、もう使え<>ないということSQLFragment aですMonoid<>2 つ目は、ファントム タイプを正しく計算するために new を実装する方法です。

私は醜いと思う方法を見つけました。もっと良い解決策があることを願っています。のを作成し、typed versionであるSQLFragmentファントム属性を使用しますHList

次に、新しいtyped演算子を作成します。!<>! これは、型シグネチャを理解していないため、記述しません

これで、型指定されたフラグメントを結合してを追跡することができなくなりました (まだタプルではなく、本当に奇妙なものですが)。

この奇妙な型をタプルに変換するために、型ファミリを作成します。

いくつかのタプルに対してインスタンス化します

別の解決策は、おそらく型ファミリを使用し、タプルのすべての組み合わせを手動で記述することです

など...

そして、それは機能します。Resultファミリを使用して関数を記述できます

私の主なプログラムは次のようになります:

そしてそれは動作します!

ただし、特に使用せずに、HList可能であれば拡張機能をできるだけ少なくする、より良い方法はありますか?

どういうわけかファントムタイプを「隠す」場合(したがって、リアルを持ち、代わりにMonoid使用できるようになります)タイプを取り戻す方法はありますか?<>!<>!

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

haskell - 関数の依存関係を使用する同等の型を単純化できる場所で、型ファミリがスタックする

HListの適切な型推論プロパティを実装しようとしてmap tagSelf :: [a] -> [Tagged a a]い ます。map untag :: [Tagged a a] -> [a]TF バージョンは近いですが、FD バージョンでは型がうまく単純化されているのに、型関数がスタックする場合があります。

以下は自己完結型の例で、doctest で実行できます。

FD バージョンと同じ動作を維持しながら、TF のより良い構文を取得することは可能ですか?

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

scala - Shapeless の _0 Nat がオブジェクトではなくクラスなのはなぜですか?

私は Shapeless を理解しようとしていますが、これに出くわしました:

_0のような特別でユニークなケースNilですList_0前科はありません。オブジェクト/ケース オブジェクト (シングルトン) ではないのはなぜですか? HListこれを行うようです:

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

scala - HList を List[Type]、List[TypeTag]、または List[String] にマップする方法

Scala REPL とその bind メソッドをいじっています。残念ながら、型の一部の型情報を消去する ClassTag が必要List[Int]ですList[_]。したがって、HList を REPL ラッパーに渡し、バインド メソッドに渡すことができる文字列として型を取得したいと考えています。このために、HList を文字列のリストにマップする必要があります。

上記のコードは機能しません。1 つには、Tuple2 を使用できません。それを解決するのはそれほど難しくないはずです。ただし、typeOf[T] には暗黙の TypeTag が必要です。どうすればこれを行うことができますか?助けてもらえshowますか?

助けてくれてありがとう。

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

haskell - モノイド インスタンス フォーム HList レコードが機能しない

Monoidのインスタンスを定義しようとしていますが、インスタンスHList Recordが重複しているというエラー メッセージが表示されます。私の試み(コードは複雑に見えますが、基本的にタプルインスタンスになるものです)

エラーメッセージ:

どういう意味ですか ?この問題を解決するにはどうすればよいですか? (私は GHC 7.6.3 を使用しています)

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

scala - ケースクラスの代わりに形状のない HList を選択する

Scalaのケースクラスよりも形のないHListを使用する利点は何ですか? HList を使用したくないのはどのような状況ですか?