問題タブ [f-bounded-polymorphism]

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 に答える
136 参照

scala - f-bound ポリモーフィック型の存在を適切に定義する方法

ここにはいくつかの同様の質問があります。私はそれらを読みましたが、コードが機能する答えが見つかりませんでした。通常よりも正確な型指定を必要とするまれなケースに遭遇したと思います。

私の場合は2つの言葉で。scala 言語の理解を深めるために、非常に単純な異種リストの例を作成したいと思います。私が自分自身に設定した制限があります。どのような形式でも暗黙的ではなく、単純な scala 型システムだけです。Implicits は多くのことを簡単にすることができますが、私は一生懸命やってみたいと思います。

私はすでにコードを動かしていますが、それを改善したいと思います。ここにあります:

Merge型コンストラクターは、2 つのリストを追加した型の結果を示します。ネストされたすべての型を追跡する必要があります。結果は次のとおりです。

これで、退屈な紹介は終わりです。残念ながら、その時点までに読者の半分を失っていました。コードを1行に折りたたむことができればいいのにと思います。

したがって、本当の問題はSelf型とselfメソッドです。見た目が悪いので、取り除きたいです。私は、f-bounded polymorphism が自然な方法で私を助けることができると信じています。次のコードを取得します。

scala コンパイラーが生成するエラーは、ほとんど洞察を与えません。

prepend 部分はスムーズに f-bound ポリモーフィズムに変換されました。マージ部分でエラーが発生しました。型を抽象化する必要があるため、追加の型指定なしで使用した初期の例と同様に、存在型でMerge境界付けました。HAnyHList

しかし、後者の場合、コンパイラが不適切な型について警告するため、一部の型情報が失われます。では、構築に必要なすべての型情報を保持するために、どのように存在型を定義できますHConsか? 抽象型ソリューションを f-bound バリアントに転送するには、より複雑な調整が必要になるのでしょうか?