Я пытаюсь выяснить, как связать функцию (одноэлементный тип) бесформенного с другим (HList), предполагая, что мы хотим получить обобщенный c тип 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]) = {
???
}
}
Однако, несмотря на то, что оба они являются очень зрелой бесформенной функцией, похоже, нет документации, объясняющей, как включить такой вывод алгебры c.
Is Есть ли простой способ заменить все мои неявные функции на достаточно общий оператор? Я сейчас использую scala -2.12 + бесформенный 2.3.
Большое спасибо за информацию.