[我正在尝试找出如何将无形状的特征(单身类型)与另一个特征(HList)相关联,假设我们想派生一个包含有关输入向量的稀疏度信息的泛型Vector
:] >
package com.tribbloids.spike.shapeless_spike.shapesafe import shapeless.{Generic, Witness} import scala.language.implicitConversions trait Vector[W <: Witness.Lt[Int]] extends Serializable { def witness: W def <*>(that: Vector[W]): Vector[W] = ??? } object Vector { case class Impl[W <: Witness.Lt[Int]](witness: W) extends Vector[W] {} def zeros[W <: Witness.Lt[Int]](witness: W): Impl[W] = Impl(witness) object Attempt1 { def values(v: (Double)) = Impl(Witness(1)) def values(v: (Double, Double)) = Impl(Witness(2)) def values(v: (Double, Double, Double)) = Impl(Witness(3)) Vector.zeros(Witness(2)) <*> values(2.0, 3.0) Vector.zeros(Witness(3)) <*> values(2.0, 3.0) // breaks as expected } }
我可以写很多行来支持派生(最终将达到JVM对类加载的限制),或者我可以写一个更简洁的隐式转换来按需动态创建单例类型,如下所示:
object Attempt2 { type HInts = Int :: HInts def values[T <: Product](v: T)(implicit aux: Generic.Aux[T, HInts]) = { ??? } }
但是,尽管两者都是非常成熟的无形特征,但似乎没有文档说明如何启用这种代数类型推导。
是否有一种简单的方法就可以用足够通用的语句替换所有隐式函数?我目前正在使用scala-2.12 + shapeless 2.3。
非常感谢您提供信息。
[我正在尝试找出如何将无形状的特征(单例类型)与另一个特征(HList)相关联,假设我们想派生包含有关Arity信息的泛型类型Vector ...