在Scala无形状库中,是否有一种本机方式将产品类型(HList / Generic / NamedGeneric)转换为等于其Arity的int单例类型?

问题描述 投票:1回答:1

[我正在尝试找出如何将无形状的特征(单身类型)与另一个特征(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 ...

scala shapeless dependent-type algebraic-data-types
1个回答
0
投票
如果您需要的是
© www.soinside.com 2019 - 2024. All rights reserved.