これは、スカラ型レベルプログラミングに使用された開発者にとっては古典的な質問ですが、解決策を見つけることができませんでした(または検索する方法がわかりません)またはこれのためのパターン。私はこのクラスのユーザーはHList
型パラメータ(Args
)とそれをインスタンス化したいとクラスがそれぞれ指定された型のインスタンスを含むHList
インスタンスを取得する方法を提供する結果の型を指定せずにシェイプレスマッパーを使用
abstract class TypedTest[Args <: HList](implicit val optMapper: Mapped[Args, Option]) {
type OptArgs = optMapper.Out
def options: OptArgs // to be implemented by subclasses
}
:私はこのようなクラスがあるとしOption
(OptArgs
)の内部にあります。私はこのために形のないMappedタイプのクラスを使用しています。私がのインスタンスがArgs
でないとインスタンス化時に提供されないことに注意してください。
具体的なタイプをOptArgs
と推測せず、def options = HNil
などの明らかに正しい実装であっても、コンパイルエラーが発生するため、このコードは機能しません。補助パターンを使用して、同じコード:
abstract class TypedTest[Args <: HList, OptArgs <: HList](implicit val optMapper: Mapped.Aux[Args, Option, OptArgs]) {
def options: OptArgs
}
これは、外部APIが不必要に冗長になりれ、インスタンス化時に両方のリストを指定するために私を強制します。このための回避策はありますか?
'OptArgs'は抽象型ではなく、' optMapper'の値に依存するパス依存型です。 'OptArgs'をタイプエイリアスとして定義しましたが、その定義を省略して' def options:optMapper.Out'と書くだけでした。パス依存型は、たとえ抽象型として定義されていても意味を持って使用できます。つまり、 'Mapper.Aux'の定義はパス依存型を型パラメータに"変換 "します。しかし、この場合には解決策がない可能性があります。 –