Scala 使用无形状映射器,无需指定结果类型

Scala 使用无形状映射器,无需指定结果类型,scala,shapeless,type-level-computation,Scala,Shapeless,Type Level Computation,对于习惯Scala类型级编程的开发人员来说,这似乎是一个经典问题,但我找不到(或者我不知道如何搜索)解决方案或模式。假设我有一个这样的类: abstract class TypedTest[Args <: HList](implicit val optMapper: Mapped[Args, Option]) { type OptArgs = optMapper.Out def options: OptArgs // to be implemented by subclasses

对于习惯Scala类型级编程的开发人员来说,这似乎是一个经典问题,但我找不到(或者我不知道如何搜索)解决方案或模式。假设我有一个这样的类:

abstract class TypedTest[Args <: HList](implicit val optMapper: Mapped[Args, Option]) {
  type OptArgs = optMapper.Out

  def options: OptArgs // to be implemented by subclasses
}

这迫使我在实例化时指定这两个列表,这使得外部API不必要地冗长。有解决办法吗?

这是我的理解,但我不是100%确定,我很乐意接受纠正

类型成员
TypedTest.OptArgs
不是抽象类型,而是类型别名。
TypedTest
的所有子类的类型都是相同的,这是
映射的[Args,Option].Out的别名,是一种抽象类型,不能与任何类型统一,只能与自身统一。创建子类时,不会覆盖类型成员
OptArgs

当将
Mapped.Aux
Out0
的存在类型一起使用时,它会变得更加清晰,这或多或少等同于上述内容:


抽象类类型测试[Args我并不打算
OptArgs
是一个抽象类型,而是一个路径相关类型-依赖于
optmap
的值。尽管我将
OptArgs
定义为一个类型别名,但我可以省略该定义,只需编写
def options:opttmapper.Out
。路径相关类型可以被有意义地使用,即使en定义为抽象类型-这就是
Mapper.Aux
的定义将路径依赖类型“转换”为类型参数所做的。不过,在这种情况下可能没有解决方案。
abstract class TypedTest[Args <: HList, OptArgs <: HList](implicit val optMapper: Mapped.Aux[Args, Option, OptArgs]) {
  def options: OptArgs
}