問題タブ [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.
scala - f-bound ポリモーフィック型の存在を適切に定義する方法
ここにはいくつかの同様の質問があります。私はそれらを読みましたが、コードが機能する答えが見つかりませんでした。通常よりも正確な型指定を必要とするまれなケースに遭遇したと思います。
私の場合は2つの言葉で。scala 言語の理解を深めるために、非常に単純な異種リストの例を作成したいと思います。私が自分自身に設定した制限があります。どのような形式でも暗黙的ではなく、単純な scala 型システムだけです。Implicits は多くのことを簡単にすることができますが、私は一生懸命やってみたいと思います。
私はすでにコードを動かしていますが、それを改善したいと思います。ここにあります:
Merge
型コンストラクターは、2 つのリストを追加した型の結果を示します。ネストされたすべての型を追跡する必要があります。結果は次のとおりです。
これで、退屈な紹介は終わりです。残念ながら、その時点までに読者の半分を失っていました。コードを1行に折りたたむことができればいいのにと思います。
したがって、本当の問題はSelf
型とself
メソッドです。見た目が悪いので、取り除きたいです。私は、f-bounded polymorphism が自然な方法で私を助けることができると信じています。次のコードを取得します。
scala コンパイラーが生成するエラーは、ほとんど洞察を与えません。
prepend 部分はスムーズに f-bound ポリモーフィズムに変換されました。マージ部分でエラーが発生しました。型を抽象化する必要があるため、追加の型指定なしで使用した初期の例と同様に、存在型でMerge
境界付けました。HAny
HList
しかし、後者の場合、コンパイラが不適切な型について警告するため、一部の型情報が失われます。では、構築に必要なすべての型情報を保持するために、どのように存在型を定義できますHCons
か? 抽象型ソリューションを f-bound バリアントに転送するには、より複雑な調整が必要になるのでしょうか?